You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:48:11