使用列子集时的pandas SettingWithCopyWarning

时间:2016-05-25 11:16:03

标签: python pandas

我正在尝试了解pandas SettingWithCopyWarning,究竟是什么触发了它如何避免它。我想从数据框中选择一列,然后使用这些列选择。我需要填充缺失值并用1替换大于1的所有值。

我知道sub_df = df [['col1','col2','col3']]会产生一个副本,这似乎就是我想要的。有人可以解释为什么在这里触发复制警告,是否有问题,以及我应该如何避免它?

我在这个背景下阅读了很多关于链接作业的内容,我在这里做这个吗?

data={'col1' : [25 , 0, 100, None],
    'col2' : [50 , 0 , 0, None],
      'col3' : [None, None, None, 100],
      'col4' : [ 20 , 20 , 20 , 20 ],
      'col5' : [1,1,2,3]}
df= pd.DataFrame(data)
sub_df=df[['col1', 'col2', 'col3']]
sub_df.fillna(0, inplace=True)
sub_df[df>1]=1 # produces the copy warning
sub_df

真正令我困惑的是,如果我没有为我的列子集使用新名称,则不会触发此警告,如下所示:

data={'col1' : [25 , 0, 100, None],
    'col2' : [50 , 0 , 0, None],
      'col3' : [None, None, None, 100],
      'col4' : [ 20 , 20 , 20 , 20 ],
      'col5' : [1,1,2,3]}
df= pd.DataFrame(data)
df=df[['col1', 'col2', 'col3']]
df.fillna(0, inplace=True)
df[df>1]=1 # does not produce the copy warning
df

谢谢!

1 个答案:

答案 0 :(得分:1)

你的2个代码片段在语义上是不同的,首先你是否想要对原始df的视图或副本进行操作是不明确的,在第二个代码片段中,用一个子集覆盖 root = /home root = ssh://root@{{ item }}//home ignore = Path virtfs ignore = Path */mail df所以没有歧义。

如果您想要复印件,请执行以下操作:

df

如果您想对视图进行操作,那么我建议使用cols列表并使用新的indexers引用它们,如下所示:

sub_df=df[['col1', 'col2', 'col3']].copy()

然后

df[col_list].fillna(0)