丢弃Pandas列Inplace Triggers SettingWithoutCopy警告

时间:2018-01-11 14:13:20

标签: python pandas csv

我需要从pandas数据帧中删除一些多余的列。因为我实际上正在处理两个这样的数据帧(两个都有相同的多余列)。我的小管道如下:

df1=pd.read_csv('path/x.csv') #another warning, possibly unrelated, see below
df2=pd.read_csv('path/y.csv')
df1=df1[df1['CODE']=='NV1']
df2=df2[df2['CODE']=='QUT1']
bad_cols=['Unnamed: 0','phrase']
df1.drop(bad_cols,axis=1,inplace=True) # triggers SettingWithoutCopy Warning
df2.drop(bad_cols,axis=1,inplace=True) # works fine, no warning

如果我可以验证丢弃是否有效(通过调用df1['phrase']等),这个警告会被忽略吗?我很困惑,因为如果设置inplace=True,似乎不应该抛出SettingWithoutCopy。

除了列不重叠100%(共有25%的列)和不同行数之外,df1df2之间存在一个重要差异 - 调用{{ 1}}引发df1=pd.read_csv('path/x.csv')我不确定这是否与sys:1: DtypeWarning: Columns (1,3341) have mixed types. Specify dtype option on import or set low_memory=False.差异有关。

2 个答案:

答案 0 :(得分:2)

步骤df1=df1[df1['CODE']=='NV1']df2=df2[df2['CODE']=='QUT1']返回原始df1df2的观看次数。 SettingWithoutCopy稍后会在您尝试修改其中一个时发出警告。

如果您注释掉df1.drop(bad_cols,axis=1,inplace=True),我希望下一行引发相同的例外。

有许多可能的解决方案

  • 颠倒操作顺序
  • 不要放弃,而是df1 = df1.drop(..)
  • 选择loc:df2=df2.loc[df2['CODE']=='QUT1',:]也应该返回副本

答案 1 :(得分:1)

你可以在一个命令中完成所有事情:

df1 = pd.read_csv('path/x.csv').drop(bad_cols,1).query("CODE=='NV1'")

如果你有一个应该保留的完整列表列,那么就这样做:

cols = ['colA','colC','colZ',...]
df1 = pd.read_csv('path/x.csv', usecols=cols).query("CODE=='NV1'")