如何在Python中对数据帧进行子集化并解决SettingWithCopy警告?

时间:2016-07-28 18:24:26

标签: python pandas dataframe subset

我已经在Python 3 Jupyter笔记本中读取了一张Excel调查回复到一个数据框中,并希望删除个人在一个特定程序中的行。所以我是数据框的子集' df'到一个新的数据框' dfgeneral'使用.loc。

notnurse = df['Program Code'] != 'NSG'
dfgeneral = df.loc[notnurse,:]

然后,我想将标签(即满意,不满意)映射到用于表示它们的代码,并找出给出每个响应的响应者数量。几个问题使用相同的比例,所以我循环使用它们:

q5list = ['Q5_1','Q5_2','Q5_3','Q5_4','Q5_5','Q5_6']

scale5_dict = {1:'Very satisfied',2:'Satisfied',3:'Neutral',
               4:'Somewhat dissatisfied',5:'Not satisfied at all',
               np.NaN:'No Response'}

for i in q5list:
    dfgeneral[i] = df[i].map(scale5_dict)
    print(dfgeneral[i].value_counts(dropna=False)) 

在输出中,我收到了SettingWithCopy警告:

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

我用.loc来创建dfgeneral;这是假阳性,还是应该做出什么改变?谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

dfgeneral = df.loc[notnurse,:]

此行(第二行)获取DataFrame的一部分并将其分配给变量。当您想要操作该变量时,您会看到警告(正在尝试在DataFrame的切片副本上设置一个值)。

将该行更改为:

dfgeneral = df.loc[notnurse, :].copy()