所以我尝试创建一个新列来指示指定条件是否为 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 的地方添加了两行代码。希望有帮助!
最佳答案
错误出现在上面的代码中,当您尝试提取某些数据帧子切片而不制作完整副本时,因此您拥有的引用实际上是对另一个较大数据帧的一部分的引用。
如果没有太多关于您要做什么的上下文,只需事先制作一份副本:
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/