在使用pandas对数据表df进行操作时,由于对表进行了筛选过滤,但并没有去生成新表,容易触发pandas的SettingWithCopyError。
有人会设置warning把这个警告直接屏蔽掉,但是这个实际是个错误【ERROR】。
虽然表现和警告⚠️一样,流程能运行,但是实际上结果是错误的,因为原始表并没有发生改变(相当于只是在excel表里做了筛选,但是没有把筛选过滤掉的结果drop掉,没有形成新表)。
因此,这个警告实际是个错误,会导致最后输出的结果实际上是没被处理的!
一般来说,使用loc来索引,将值改变能避免这个问题
df.loc[:, "col"] = "xxx"
然而,SettingWithCopyError并不会告诉你发生问题的位置,当代码又臭又长之后,定位困难。下面是解决方案,给代码套个try except:
# 改变链式错误的回报模式
pd.options.mode.chained_assignment = 'raise'
try:
<你的代码>
except pd.core.common.SettingWithCopyError as e:
print(e)
还有另外的做法,可以插入下面这个代码
import warnings
import traceback
pd.options.mode.chained_assignment = 'warn'
def warn_with_traceback(message, category, filename, lineno, file=None, line=None):
log = warnings.formatwarning(message, category, filename, lineno, line)
print(log)
traceback.print_stack()
warnings.showwarning = warn_with_traceback