如何修复SettingWithCopyWarning?

How to fix SettingWithCopyWarning?

提问人:Pop23 提问时间:8/29/2023 最后编辑:Amira BedhiafiPop23 更新时间:8/29/2023 访问量:33

问:

我正在尝试在我的数据帧中创建一个新列并收到 SettingWithCopyWarning 错误。我已经在网站上查看了有关此的其他问题,但似乎无法解决我遇到的问题。

这是原始代码:

tcep['time_difference'] = (pd.to_datetime(tcep['time_end']) - pd.to_datetime(tcep['time_start'])).dt.days

当它出现错误时说:

尝试在 DataFrame 中的切片副本上设置值

我尝试了以下方法:

tcep['time_difference'] = tcep.apply(lambda row: ((pd.to_datetime(row.time_end) - pd.to_datetime(row.time_start)).days, axis=1)

但这也带来了同样的错误。有谁知道如何解决这个问题?

python pandas 数据帧 pandas-settingwithcopy-warning

评论


答:

0赞 Amira Bedhiafi 8/29/2023 #1

当您尝试在 df 上设置一个值时,该值可能是另一个 df 的视图(或切片),而不是副本,在 pandas 中会引发警告。这意味着您可以在不知不觉中更改原始数据帧。SettingWithCopyWarning

要确保它不是其他数据帧上的视图,您可以显式创建一个副本,然后按如下方式操作:tcep

tcep = tcep.copy()
tcep['time_difference'] = (pd.to_datetime(tcep['time_end']) - pd.to_datetime(tcep['time_start'])).dt.days

如果使用该方法,则代码中存在拼写错误。您缺少 lambda 函数的右括号:apply

tcep = tcep.copy()
tcep['time_difference'] = tcep.apply(lambda row: (pd.to_datetime(row.time_end) - pd.to_datetime(row.time_start)).days, axis=1)