Python pandas跨列统计'Yes'响应次数触发SettingWithCopyWarning问题
Pandas多列Yes值计数触发SettingWithCopyWarning解决方法
问题场景
现有一个存储多列"Yes"/"No"响应值的DataFrame,需要新增一列,统计指定条件列中值为"Yes"的总次数。
执行计数代码时持续触发告警,使用的代码如下:
df2['Count'] = df2.iloc[:, 0:9].eq('Yes').sum(axis=1)
触发的告警信息:
<ipython-input-21-189874c017d3>:1: 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
原因说明
你的计数逻辑本身没有任何问题,逐行匹配"Yes"再按行求和的写法完全能得到正确的统计结果。
这个告警是pandas的链式赋值提醒:你当前操作的df2本身是从其他DataFrame切片得到的非独立对象,pandas无法判定你这次给新列赋值的操作,是想要修改最原始的母DataFrame,还是仅修改当前切片出来的临时表,怕你逻辑写漏误改数据才弹出提示。
可选解决方案
选任意一种符合你使用场景的方法即可:
- 推荐方案:先将
df2转为独立的DataFrame副本,切断和原始母表的关联,再执行原有计数逻辑,后续所有操作都不会再触发同类告警# 显式生成独立副本 df2 = df2.copy() # 原有计数逻辑可正常运行 df2['Count'] = df2.iloc[:, 0:9].eq('Yes').sum(axis=1) - 无额外内存开销方案:按告警提示使用
.loc明确指定赋值的列范围,明确告知pandas你就是要修改当前df2对象df2.loc[:, 'Count'] = df2.iloc[:, 0:9].eq('Yes').sum(axis=1) - 临时屏蔽方案(不推荐):如果确认自身逻辑无误,且不想调整原有代码,可以直接关闭pandas的链式赋值告警,但这种方式可能掩盖后续其他索引赋值的逻辑错误
import pandas as pd pd.set_option('mode.chained_assignment', None)
执行后生成的Count列会逐行统计前9列中"Yes"值的出现次数,完全匹配预期的新增列效果。
内容的提问来源于stack exchange,提问作者who_dat_ninjya
相关产品推荐
相关产品推荐

