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/SeriesDF 是为了“指定每个索引使用哪个值”,df[["A", 'B']] 非常适合DataFrame。您的方法是一个很好的解决方法,但我的问题还是“这是一个错误还是按预期工作?”。

以上是关于Pandas fillna()不适用于DataFrame切片[重复]的主要内容,如果未能解决你的问题,请参考以下文章

pandas 处理缺失值[dropna、drop、fillna]

Pandas fillna('Missing')

pandas.DataFrame.fillna - TypeError:只有整数标量数组可以转换为标量索引

Fillna 一次使用多种方法 - pandas

Pandas - fillna 与特定类别的平均值

使用 fillna 在 Pandas 中使用列表填充空值