摆脱Python pandas中的SettingWithCopyWarning

时间:2015-04-19 04:44:56

标签: python pandas

在加载带有pandas的csv后,我正在加载一堆csv并处理某些列(如果存在)

data = pd.read_csv('Test.csv', encoding = "ISO-8859-1", index_col=0)

此数据框将用于示例

import pandas as pd
data = pd.DataFrame({'A': [1, 2.1, 0, 4.7, 5.6, 6.8],
                    'B': [0, 1, 0, 0, 0, 0],
                    'C': [0, 0, 0, 0, 0, 1],
                    'D': [5, 5, 6, 5, 5.6, 6.8],
                    'E': [2, 4, 1, 0, 0, 5],
                    'F': [0, 0, 1, 0, 0, 0],
                    'G': [0, 0, 0, 0, 0, 0],})

接下来,我检查并选择要处理的特定列

coltitles = ['A', 'B','C', 'D', 'E']

columns = []

for name in coltitles:
    if name in data.columns:
        columns.append(name)
    else:
        print (name, 'is missing')

df = data[columns]

if 'A' in df.columns:
    #perform some processing, I will put print to simplify it
    print ('Exist')

如果我使用data的数据框,代码可以工作,但如果我从csv加载数据,我会收到警告:

<module3>:74: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

警告是由df = data[columns]

所在的行引起的

代码仍然可以使用警告,但如何在不抑制警告的情况下摆脱此警告?

1 个答案:

答案 0 :(得分:1)

  

链式分配警告/异常旨在通知   用户可能无效的分配。可能存在误报;   无意中报告链式作业的情况。

此警告的目的是向用户标记分配是在DataFrame切片的副本而不是原始Dataframe本身上执行的。

您通常希望使用.loc(或.iloc,.at等)类型索引而不是&#39;链接&#39;索引有可能无法始终按预期工作。

为了清楚说明您只想分配数据的副本(相对于原始切片的视图),您可以将.copy()附加到您的请求中,例如

df = data[columns].copy()

有关详细信息,请参阅documentation