我有一个名为combined的数据框,我试图简单地通过具有null / nan值的列进行迭代并替换它们。我完成此任务的代码如下:
def fix_null_columns():
null_columns = [col for col in combined.columns if combined[col].isnull().values.any()]
for col in null_columns:
try:
col_mean_or_mode = pd.Series.mean(combined[col])
except:
col_mean_or_mode = pd.Series.mode(combined[col])
combined[col].fillna(col_mean_or_mode, inplace = True)
代码运行正常,但它不会替换原始DF上的任何内容。我一直坚持这个侮辱性的简单任务一天,所以我很感激任何帮助。
我从不同的角度尝试过这个问题。我已确保使用inplace = True
。我已确保我的NaN值为np.nan
。我只是迷失了为什么这不起作用。谢谢!
编辑添加MCVE:
示例数据框:
>df
index col1 col2 col3 col4
0 20 1158 1218 NaN
1 21 1108 0 Grvl
2 22 1795 0 NaN
3 23 1060 0 NaN
4 24 1060 0 NaN
col4有分类数据,显然有一些NaN。 pd.Series.mode(df[col4])
按预期返回Grvl
。
然后我定义:
def fix_null_columns():
null_columns = [col for col in df.columns if df[col].isnull().values.any()]
for col in null_columns:
try:
col_mean_or_mode = pd.Series.mean(df[col])
except:
col_mean_or_mode = pd.Series.mode(df[col])
df[col].fillna(col_mean_or_mode, inplace = True)
然后我运行fix_null_columns()
并再次检查我的df:
>df
index col1 col2 col3 col4
0 20 1158 1218 Grvl
1 21 1108 0 Grvl
2 22 1795 0 NaN
3 23 1060 0 NaN
4 24 1060 0 NaN
这与我之前遇到的情况略有不同,但仍有意外行为。 df [col4]的第一个值发生了变化,其余的NaN保持不变。我很困惑。
所需的输出显然是:
>df
index col1 col2 col3 col4
0 20 1158 1218 Grvl
1 21 1108 0 Grvl
2 22 1795 0 Grvl
3 23 1060 0 Grvl
4 24 1060 0 Grvl