python - 使用 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 时,我从来没有遇到过这样的错误。
解决方案
这里的问题是这样的。首先,您将数据读入名为“文件”的 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)
以上不会给你警告。
推荐阅读
- kotlin - Neo4j OGM - 在 Kotlin 中反序列化枚举列表
- c - 为什么没有换行符 printf 不起作用?
- c++ - clang 在 Xcode 中以 Release 模式编译 .cpp 时崩溃,但在调试中正常
- postgresql - 从 EAV 结构结果集中选择 JSON 值
- reactjs - 如何知道用户已经在firebase中的另一个浏览器上登录
- python - 如何从数据框列形成元组列表
- amazon-web-services - 如何使用 powershell 从 S3 向 Neptune 实例发送 json 数据?
- javascript - 在 Web 视图中从 LocalStorage 读取数据
- ios - CLLocationManager 使用不准确的坐标更新位置
- laravel-5 - 由于身份验证失败,在 codeception 中登录后无法执行操作 [无法发送令牌]