【发布时间】:2021-10-30 22:41:16
【问题描述】:
这个问题有很多类似的问题,但我找不到能具体回答我问题的问题。
首先,当我运行这样的东西时
df['new_col'] = df['col2'] - df['col1']
我收到一条警告,提示“正在尝试在 DataFrame 的切片副本上设置值。请尝试改用 .loc[row_indexer,col_indexer] = value”。
如果我然后尝试运行这样的东西
df.loc[:, 'new_col'] = df['col2'] - df['col1']
我收到“SettingWithCopyWarning”警告,并显示相同的消息“正在尝试在 DataFrame 的切片副本上设置值。请尝试改用 .loc[row_indexer,col_indexer] = value”。
使用其他帖子中一些答案所建议的 apply 和 lambda 函数会引发“SettingWithCopyWarning”警告,而且操作似乎也很慢。
df.loc[:, 'new_col'] = df.apply(lambda x: x['col2'] - x['col1'], axis=1)
我阅读了文档页面,但恐怕我不完全理解它们,否则我会很清楚进行这种计算的正确格式是什么。
是的,所以我的问题是:如何减去 Pandas 数据框的列,以正确的方式为同一数据框创建一个新的,以便 Pandas 满意?谢谢!
【问题讨论】:
-
警告是因为 Pandas 无法判断计算是视图还是新数组(视图可以更改原始数据帧的数据)。一种方法是进行显式复制,或者使用
assign方法(在内部进行复制;如果您要创建多个列,这是有效的,因为复制只进行一次) -
问题不是
df['new_col'] = df['col2'] - df['col1']。问题出在此操作的上游。您必须在此行之前发布您的代码。一个有用的链接:dataquest.io/blog/settingwithcopywarning -
谢谢大家,这有帮助!
标签: python pandas dataframe warnings