正在尝试在DataFrame

时间:2016-12-18 09:43:18

标签: python pandas dataframe

我收到以下警告:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

在以下行:

df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']].fillna(0, inplace=True)

我如何解决此警告?

3 个答案:

答案 0 :(得分:6)

df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']]创建数据框,该数据框是df3的子集。由于您使用的是inplace=True,因此您会收到上述警告,因为它会尝试修改新的数据框,您不会在其中保留参考(我怀疑如果您打印{ {1}}你会看到这条线实际上没有效果。)

我执行以下操作之一:

  1. 在不使用df3的情况下将新创建的数据框重新分配回df3

    inplace=True
  2. 或稍微偏好的方式(至少在我看来):

    1. 将要修改的列作为字典传递df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']] = \ df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']].fillna(0) 。键是列'名称和值是fillna应在每列中替换的内容:

      NaN

      在此示例中,您可以使用字典理解:

      df3.fillna({'prod_tags_0': 0, 'prod_tags_1': 0,
                  'prod_tags_2': 0, 'prod_tags_3': 0}, inplace=True)
      

答案 1 :(得分:0)

这里要澄清两个答案:两个都是正确的。使用df[["column"]]语法(请注意双括号)的索引确实会导致inplace=True无效,因为它正在对数据帧的副本进行操作,但是使用df.loc["column"]-或为此{ {1}}-使用inplace标志将按预期成功,尽管发出警告 ,但我相信这是一个错误。

很显然,DeepSpace的答案(尤其是关于在字典上使用而不是在DataFrame的某个切片上使用fillna()的答案)更为优雅,但是没有理由不能使用df["column"]或{{ 1}}。

答案 2 :(得分:0)

  1. 不使用dataframe将新创建的df3重新分配回inplace=True

尝试一下:

df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']] = \ df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']].fillna(0)