所以我正在尝试创建一个新列,指示指定的条件是否为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
但我不认为他们会做我想要的。 有人有什么建议吗?我知道这个问题可能听起来很愚蠢,但仍然感谢任何帮助!
修改 我在我创建data_sub的地方添加了2行代码。希望有所帮助!
答案 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
你看到错误被抑制了。有趣的是,在垂直子对象上执行类似操作时,看不到相同的行为。我相信熊猫通过返回完整的独立副本来巧妙地处理这个问题。