我收到以下警告:

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)

我如何解决此警告?

最佳答案

df3[['prod_tags_0', 'prod_tags_1', 'prod_tags_2', 'prod_tags_3']]创建一个新的数据帧,该数据帧是df3的子集。由于您使用的是inplace=True,因此会收到上述警告,因为它尝试就地修改新的数据框,因此您不会对其进行引用(而且我怀疑如果您要打印df3,您会看到此行实际上已经没有效果)。

我将执行以下操作之一:

  • 将新创建的数据框重新分配回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)
    

  • 或稍微更可取的方式(至少在我看来):
  • 将要修改的列通过fillna传递为字典。键是列的名称,值是每列中应替换为NaN的值:
    df3.fillna({'prod_tags_0': 0, 'prod_tags_1': 0,
                'prod_tags_2': 0, 'prod_tags_3': 0}, inplace=True)
    

    在此示例中,您可以使用字典理解:
    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'prod_tags_0': [np.nan], 'prod_tags_1': [np.nan],
                       'prod_tags_2': [np.nan]})
    
    print(df)
    >>     prod_tags_0  prod_tags_1  prod_tags_2
        0          NaN          NaN          NaN
    
    df.fillna({'prod_tags_' + str(i): 0 for i in range(2)}, inplace=True)
    
    print(df)
    
    >>     prod_tags_0  prod_tags_1  prod_tags_2
        0          0.0          0.0          NaN
    
  • 关于python - 正在尝试从DataFrame的切片副本上设置一个值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41207160/

    10-12 19:08