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())以及索引

使用 loc 更新数据框 python pandas

将 append() 与 df.loc == 语句一起使用 Pandas Python

Python Pandas DataFrame:查询数据or选择数据(selection)之loc,iloc,at,iat,ix的用法和区别

如何在 Pandas 或 Python 中根据某些条件放置项目?