Pandas fillna()不适用于DataFrame切片[重复]
Posted
技术标签:
【中文标题】Pandas fillna()不适用于DataFrame切片[重复]【英文标题】:Pandas fillna() not working on DataFrame slices [duplicate] 【发布时间】:2019-09-03 23:30:29 【问题描述】:Pandas fillna
不适用于 DataFrame 切片,这是一个示例
df = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list('ABCD'))
df[["A", 'B']].fillna(0, inplace=True)
DataFrame
不变
A B C D
0 NaN 2.0 NaN 0
1 3.0 4.0 NaN 1
2 NaN NaN NaN 5
3 NaN 3.0 NaN 4
对比
df["A"].fillna(0, inplace=True)
和
df.fillna(0, inplace=True)
工作正常。
这是一个错误还是按预期工作? 提前谢谢。
附: this 问题询问 如何 在切片上使用 fillna
,至于我的问题,它涉及 为什么 以上不起作用。
答案在@heena-bawa 答案评论部分。
【问题讨论】:
【参考方案1】:我认为它按预期工作。如果我尝试您的代码,它会引发警告:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
downcast=downcast, **kwargs)
含义:通过以这种方式选择列,您正在生成一个副本,因此 inplace 参数不会产生影响。
【讨论】:
【参考方案2】:你可以使用:
df[['A','B']] = df[['A','B']].fillna(0)
A B C D
0 0.0 2.0 NaN 0
1 3.0 4.0 NaN 1
2 0.0 0.0 NaN 5
3 0.0 3.0 NaN 4
【讨论】:
inplace=True
的目的不就是为了避免使用赋值运算符吗?
inplace=True 对于数据帧的切片将不起作用。它适用于完整的数据框。您只需更新切片。
更多信息可以参考:pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html【参考方案3】:
如果我们查看pandas documentation
,它说您应该在切片上使用以下fillna
:
values = 'A':0, 'B':0
df.fillna(value=values, inplace=True)
print(df)
A B C D
0 0.0 2.0 NaN 0
1 3.0 4.0 NaN 1
2 0.0 0.0 NaN 5
3 0.0 3.0 NaN 4
【讨论】:
感谢您的回答,但我认为给出dict/Series
或DF
是为了“指定每个索引使用哪个值”,df[["A", 'B']]
非常适合DataFrame
。您的方法是一个很好的解决方法,但我的问题还是“这是一个错误还是按预期工作?”。以上是关于Pandas fillna()不适用于DataFrame切片[重复]的主要内容,如果未能解决你的问题,请参考以下文章
pandas 处理缺失值[dropna、drop、fillna]