python:为什么我要设置withwithwarning

时间:2017-10-25 00:38:10

标签: 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的地方添加了2行代码。希望有所帮助!

1 个答案:

答案 0 :(得分:1)

错误在上面的代码中,当您尝试提取某些数据帧子片而不进行完整复制时,所以您的引用实际上是对另一个较大数据帧的一部分的引用。

如果没有太多关于你要做什么的背景,请事先制作一份副本:

data_sub = data_sub.copy()
data_sub['PackageLengthFlag'] = ((data_sub['AUDIT_Primary_Length'] \
                   - data_sub['PKG_SUB_Length']).abs() > threshold).astype(int)

致电df.abs以对整个结果执行abs功能。 abs是一个vanilla 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

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