【问题标题】:Pandas fillna() not working on DataFrame slices [duplicate]Pandas fillna()不适用于DataFrame切片[重复]
【发布时间】: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 答案评论部分。

【问题讨论】:

    标签: python pandas dataframe fillna


    【解决方案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
      

      【讨论】:

      【解决方案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。您的方法是一个很好的解决方法,但我的问题还是“这是一个错误还是按预期工作?”。
      猜你喜欢
      • 2018-05-07
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 2017-03-28
      • 2012-08-06
      相关资源
      最近更新 更多