python - 为什么这段代码会抛出SettingWithCopyWarning?

标签 python pandas

所以我尝试创建一个新列来指示指定条件是否为 True。我希望该列简单地注明“1”或“0”。

这是我的代码:

data_sub = data_orig.loc[~pd.isnull(data_orig['Last_Audit_Date']), :]
data_sub.reset_index(inplace=True)
data_sub['PackageLengthFlag'] = (abs(data_sub.loc['AUDIT_Primary_Length'] - data_sub.loc[:, 'PKG_SUB_Length']) > threshold)

我认为如果我将其转换为整数,默认情况下 True = 1 和 False = 0,对吧? (我想我在某处读到过这样的说法......)

这是我不断收到的警告:

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

我读到:

How to deal with SettingWithCopyWarning in Pandas?

Correct way to set value on a slice in pandas

Pandas SettingWithCopyWarning

但我认为他们没有达到我想要的效果。 有人有什么建议吗?我知道这个问题可能听起来非常愚蠢,但仍然感谢您的帮助!

编辑 我在创建 data_sub 的地方添加了两行代码。希望有帮助!

最佳答案

错误出现在上面的代码中,当您尝试提取某些数据帧子切片而不制作完整副本时,因此您拥有的引用实际上是对另一个较大数据帧的一部分的引用。

如果没有太多关于您要做什么的上下文,只需事先制作一份副本:

data_sub = data_sub.copy()
data_sub['PackageLengthFlag'] = (
    data_sub['AUDIT_Primary_Length']
        .sub(data_sub['PKG_SUB_Length'])
        .abs()
        .gt(threshold)
        .astype(int)

调用df.abs对整个结果执行abs函数。 abs 是一个普通的 Python 方法,无法处理 pd.Series 对象。

最后一个 astype 调用将结果转换为整数值。

<小时/>

以下是您正在执行的操作的示例:

df

  A_Key B_ID C_Key  D_NA
0   123   22   343    23
1   121   23  45.4    52

x = df.iloc[[0], :]
x

  A_Key B_ID C_Key  D_NA
0   123   22   343    23

x.iloc[:, 0] += 2
/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/pandas/core/indexing.py:517: 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

您会看到生成的错误。但大多数情况下,还是应该在不影响原来的情况下对原来的进行修改。现在,首先复制:

x = x.copy()
x.iloc[:, 0] += 2  # no warning

您会看到错误已被抑制。有趣的是,在垂直子切片上执行类似的操作时,不会看到相同的行为。我相信 pandas 通过返回完整的独立副本巧妙地处理了这个问题。

关于python - 为什么这段代码会抛出SettingWithCopyWarning?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46922107/

相关文章:

python - 将字符串列转换为整数

python - scikit 认为简单的单向量输入数组不兼容

python - groupby 不适用于 Pandas.Series

python - 绘制 95% 置信区间 errorbar python pandas dataframes

python - 无法卸载 enum34(Python 3.6、MacOS)

python - 是否有隐式导入/加载的模块?

python - 如何对 Tornado 进行单元测试?

python - 像列表一样生成字典值

python - 列表中的值发生了什么?

python - for循环中的条件