Python Pandas:即使使用 .loc 也无法撼动 SettingWithCopyWarning 错误
Posted
技术标签:
【中文标题】Python Pandas:即使使用 .loc 也无法撼动 SettingWithCopyWarning 错误【英文标题】:Python Pandas: Cannot shake SettingWithCopyWarning error, even wth .loc usage 【发布时间】:2017-07-07 05:14:40 【问题描述】:我已经检查了这些现有问题:
stack overflow .loc example 1
stack overflow .loc example 2
stack overflow .loc example 2
...但我还没有完全理解这个问题。
我正在尝试编写一个模块来匹配字符串,方法是在源和目标上逐步转换它们,并检查其他匹配项。为了跟踪重复的转换/匹配尝试,我将数据框用于源、目标和匹配项。
因此,部分解决方案是为尚未匹配的项目创建源/目标子集,应用转换,并提取任何匹配结果。所以我的代码如下所示:
import pandas as pd
def trymatch(transformers):
global matches, source, target
# Don't bother doing work if we've already found a match
if matches is not None:
s_ids = matches['id_s'].values
s_inmask = (~source['id'].isin(s_ids))
s = source.loc[s_inmask].copy()
# ... do the same for the target dataframe
else:
s = source
t = target
for transformer in transformers:
# Call the transformations here...
mnew = pd.merge(s, t, on='matchval', suffixes=['_s', '_t'])
if matches is None: matches = mnew
else: matches = matches.append(mnew)
# ----------------------------------------------------------------------------------------------------------------------
source = pd.DataFrame('id': [1, 2, 3], 'value': ['a', 'b', 'c'])
target = pd.DataFrame('id': [4, 5, 6], 'value': ['A', 'b', 'd'])
matches = None
trymatch(['t_null'])
trymatch(['t_upper'])
我的挑战来自 trymatch 函数,如果匹配已经存在,我将创建子集。即使使用 .loc 索引,Python 也会向我抛出 SettingWithCopyWarning。我可以使用 .copy() 摆脱它们,就像我在这里展示的那样......我认为这是有效的,因为我只需要这个函数的子集的临时副本。
这看起来有效吗?我可以用 .is_copy = False 压制并节省内存吗?
有没有更 Pythonic 的方式来解决这个问题,可以完全回避这个问题?
【问题讨论】:
【参考方案1】:你写的是有效的。 pandas
在这种情况下会抛出 SettingsWithCopy
警告,因为它依赖于 numpy
数组语义,为了提高效率,它返回数据的视图,而不是副本。 pandas
无法自身检测到这何时会导致问题,因此它(保守地)只会在好的情况和坏的情况下抛出这个错误。
您可以使用以下方法消除错误消息:
pd.options.mode.chained_assignment = None # default='warn'
更多详情见How to deal with SettingWithCopyWarning in Pandas?
【讨论】:
以上是关于Python Pandas:即使使用 .loc 也无法撼动 SettingWithCopyWarning 错误的主要内容,如果未能解决你的问题,请参考以下文章
Python pandas.DataFrame.loc函数方法的使用
python:pandas之DataFrame取行列(df.loc(),df.iloc())以及索引
将 append() 与 df.loc == 语句一起使用 Pandas Python
Python Pandas DataFrame:查询数据or选择数据(selection)之loc,iloc,at,iat,ix的用法和区别