【问题标题】:How to subset a dataframe and resolve the SettingWithCopy warning in Python?如何对数据框进行子集化并解决 Python 中的 SettingWithCopy 警告?
【发布时间】:2016-07-28 18:24:26
【问题描述】:

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

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;这是误报,还是我应该做些什么改变?感谢您的帮助。

【问题讨论】:

    标签: python pandas dataframe subset


    【解决方案1】:
    dfgeneral = df.loc[notnurse,:]
    

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

    将该行更改为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2021-12-04
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2013-08-15
      相关资源
      最近更新 更多