Pandas 仅对具有至少 1 个非 NaN 值的行进行填充
Pandas fillna only on rows with at least 1 non-NaN value
假设我有一个这样构造的 DataFrame:
import pandas as pd
import numpy as np
df = pd.DataFrame(data = {"col1":[3, np.nan, np.nan, 21],
"col2":[4, np.nan, 12, np.nan],
"col3":[33, np.nan, 55, np.nan]})
看起来像这样:
col1 col2 col3
0 3.0 4.0 33.0
1 NaN NaN NaN
2 NaN 12.0 55.0
3 21.0 NaN NaN
我想过滤到至少有 1 个非 NaN 值 的列 ,然后填充到位。
如果我执行以下操作:
df.loc[df.dropna(thresh=1).index, :].fillna("fill value")
这将创建一个新的 DataFrame,其中正确填充了值,并删除了全部为 NaN 的行。
但我想保留所有 NaN 行,所以我尝试就地应用它:
df.loc[df.dropna(thresh=1).index, :].fillna("fill value", inplace=True)
但是没有对原始 DataFrame 进行任何更改 - 我做错了什么?
澄清一下,您希望所有 NaN 行都保留为 nan,但用一个值填充其他 NaN?并就位?
像这样的东西应该可以工作:
df.where(df.isnull().all(axis=1), df.fillna(100), inplace=True)
where 保留整行为空的值,否则,将其替换为 df.fillna() 值。
假设我有一个这样构造的 DataFrame:
import pandas as pd
import numpy as np
df = pd.DataFrame(data = {"col1":[3, np.nan, np.nan, 21],
"col2":[4, np.nan, 12, np.nan],
"col3":[33, np.nan, 55, np.nan]})
看起来像这样:
col1 col2 col3
0 3.0 4.0 33.0
1 NaN NaN NaN
2 NaN 12.0 55.0
3 21.0 NaN NaN
我想过滤到至少有 1 个非 NaN 值 的列 ,然后填充到位。
如果我执行以下操作:
df.loc[df.dropna(thresh=1).index, :].fillna("fill value")
这将创建一个新的 DataFrame,其中正确填充了值,并删除了全部为 NaN 的行。
但我想保留所有 NaN 行,所以我尝试就地应用它:
df.loc[df.dropna(thresh=1).index, :].fillna("fill value", inplace=True)
但是没有对原始 DataFrame 进行任何更改 - 我做错了什么?
澄清一下,您希望所有 NaN 行都保留为 nan,但用一个值填充其他 NaN?并就位?
像这样的东西应该可以工作:
df.where(df.isnull().all(axis=1), df.fillna(100), inplace=True)
where 保留整行为空的值,否则,将其替换为 df.fillna() 值。