Python 使用列的子集时,使用COPYWARNING设置

Python 使用列的子集时,使用COPYWARNING设置,python,pandas,Python,Pandas,我试图了解熊猫设置的CopyWarning,到底是什么触发了它,以及如何避免它。我想从数据框中选择一组列,然后使用这组列。我需要填充缺少的值,并用1替换所有大于1的值 我知道sub_df=df['col1','col2','col3']]生成一个副本,这似乎就是我想要的。有人能解释一下为什么这里会触发复制警告,它是否有问题,以及我应该如何避免它吗 我在这方面读了很多关于链式作业的书,我在这里做这个吗 data={'col1' : [25 , 0, 100, None], 'col2' :

我试图了解熊猫设置的CopyWarning,到底是什么触发了它,以及如何避免它。我想从数据框中选择一组列,然后使用这组列。我需要填充缺少的值,并用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

谢谢

您的两个代码片段在语义上是不同的,第一个代码片段不确定您是要对原始df的视图还是副本进行操作,第二个代码片段用
df
的子集覆盖
df
,因此不存在歧义

如果要对副本进行操作,请执行以下操作:

sub_df=df[['col1', 'col2', 'col3']].copy()
如果您想对视图进行操作,我建议使用col列表,并使用如下所示的新方法引用它们:

df[col_list].fillna(0) 
然后

df.loc[df > 1, col_list] = 1

这两个代码段在语义上是不同的,第一个代码段不明确您是想对原始df的副本还是视图进行操作,第二个代码段用原始DFT的子集覆盖原始df,那么解决方案是否能让pandas清楚我确实想创建一个副本?我该怎么做呢?这取决于你想做什么,如果你想在副本上操作,那么就做
sub_df=df[['col1','col2','col3']]。copy()
如果你想在视图上操作,你最好定义一个col列表,并使用新的so
df[col_list']。fillna(0)
然后
df.loc[df>1,col_list]=1
谢谢!现在清楚了。第一行不会有两个副本吗?@Konstantin抱歉,我不明白,第一行创建了第二个df,它是原始df的一个子部分,但它将是一个不同的副本,而不是一个视图。我只是想知道df['col1',col2',col3']]是否还没有创建副本,所以添加了一个.copy()将生成第二个副本。@Konstant视情况而定,它可能返回一个副本或视图,如果您试图修改它,将发出警告,这就是产生混淆的地方,因此您需要明确说明您的意图