我需要从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%的列)和不同行数之外,df1
和df2
之间存在一个重要差异 - 调用{{ 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.
差异有关。
答案 0 :(得分:2)
步骤df1=df1[df1['CODE']=='NV1']
和df2=df2[df2['CODE']=='QUT1']
返回原始df1
和df2
的观看次数。 SettingWithoutCopy
稍后会在您尝试修改其中一个时发出警告。
如果您注释掉df1.drop(bad_cols,axis=1,inplace=True)
,我希望下一行引发相同的例外。
有许多可能的解决方案
df1 = df1.drop(..)
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'")