python - Pandas Dataframe SettingWithCopyWarning 复制方法
问题描述
我有这个程序进行演示:
import pandas as pd
d = {'foo':[100, 111, 222],
'bar':[333, 444, 555]}
df = pd.DataFrame(d)
list = [333,444]
dferg = df.loc[df.bar.isin(list)]
dferg['test'] = 123
我收到警告:
SettingWithCopyWarning:
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
See the caveats in the documentation: http://pandas.pydata.org/pandas-
docs/stable/indexing.html#indexing-view-versus-copy
dferg['test'] = 123
当我改变时:
dferg = df.loc[df.bar.isin(list)]
至
dferg = df.loc[df.bar.isin(list)].copy()
没有更多的警告。但这是最好的方法吗?
解决方案
dferg = df.loc[df.bar.isin(list)]
是一个 get 操作,它可以返回一个视图或一个副本。调用.copy()
明确告诉它实际上是一个副本,因此不会发出警告。dferg['test'] = 123
也会修改原件df
,因此 pandas 会警告您,以防您可能想要使用副本而不是视图。
考虑一下您是否希望df
通过您所做的任何分配来修改原始 DataFrame dferg
。如果您真的想修改第一个 DataFrame,请将所有内容放在一个.loc
调用中:
df.loc[df.bar.isin(list), 'test'] = 123 # sets 123 in df
否则,只需像您说的那样明确调用 copy :
dferg = df.loc[df.bar.isin(list)].copy()
dferg['test'] = 123 # ONLY modifies dferg, not original df
推荐阅读
- c# - 如何使用 Src asp.net 核心从同一解决方案中的另一个项目获取图像?
- html - 使用 CSS - 如何让文本位于图像的右侧?
- aws-lambda - Google Action 有时无响应
- unit-testing - 使用参数化模块链接装饰器
- c# - 基于日期 20210419 的字符串排序列表
- perl - My Bot::BasicBot 基于 Perl bot 仅连接但不执行其他操作
- java - 无法解析方法'setTitle(java.lang.String)'android studio
- amazon-web-services - Cloud9 上的 AWS copilot InvalidClientTokenId:请求中包含的安全令牌无效(状态码:403)
- flutter - listviewbuilder下的下拉列表在listviewbuilder下的下拉列表中颤动
- python - 改进分类不平衡数据集