首页 > 解决方案 > 使用 inplace=True 时出现 SettingWithCopy 错误

问题描述

我在运行以下代码时收到 SettingWithCopy 警告:

expNo = 1
file = pd.read_csv(file_name)
data = file[file['valid_data']==1]
data.rename(columns={'time':'delay'},inplace=True)
data['delay'].replace([199, 299, 399], [200, 300, 400], inplace=True)
data = data[['work','delay','answer','actual']]
if expNo == 1:
    data['prob'] = 50
if expNo ==2:
    data['prob'] = 75

prob 不是 csv 文件中的字段,因此它被附加到文件中。

谁能解释一下这里有什么问题?当我学习 Pandas 时,我从来没有遇到过这样的错误。

标签: pythonpandas

解决方案


这里的问题是这样的。首先,您将数据读入名为“文件”的 pandas DF 中。然后,您将“文件”DF 子集化为“数据”DF。然后你修改“数据”。“数据”DF实际上是“文件”DF的视图。因此,您最终会修改“文件”DF 的一部分。消除警告的一种方法是在第 3 行末尾附加“复制”:

data = file[file['valid_data']==1].copy()

这将创建一个独立于“文件”DF 的“数据”DF。作为一个次要的挑剔,我建议为您的 DF 使用更具描述性的名称。

自包含的代码片段(在未来的问题中非常感谢)如下:

import pandas as pd
file = pd.DataFrame([{'time': 199, 'work': 'a', 'answer': 'b', 'actual': 'a', 'valid_data': 1}, {'time': 299, 'work': 'a', 'answer': 'c', 'actual': 'a', 'valid_data': 0}, {'time': 300, 'work': 'a', 'answer': 'd', 'actual': 'a', 'valid_data': 1}])
data = file[file['valid_data']==1]
data.rename(columns={'time':'delay'}, inplace=True)

以上将给你一个警告。

import pandas as pd
file = pd.DataFrame([{'time': 199, 'work': 'a', 'answer': 'b', 'actual': 'a', 'valid_data': 1}, {'time': 299, 'work': 'a', 'answer': 'c', 'actual': 'a', 'valid_data': 0}, {'time': 300, 'work': 'a', 'answer': 'd', 'actual': 'a', 'valid_data': 1}])
data = file[file['valid_data']==1].copy()
data.rename(columns={'time':'delay'}, inplace=True)

以上不会给你警告。


推荐阅读