如何解决Jupyter Notebook中Pandas的SettingWithCopyWarning警告
问题根因
- 警告触发的核心是
df = df[['winner']]这行代码生成了原分组DataFrame的切片对象,Pandas无法确认该对象是指向原数据的视图还是独立副本,后续对该切片直接新增列赋值时就会触发安全警告。
修复方案
方案1(最稳妥,推荐):明确创建独立副本
修改切片行的代码,主动调用.copy()方法生成完全独立的DataFrame,后续修改不会和原数据产生关联,警告直接消除:
# 把原来的 df = df[['winner']] 替换为下面的写法 df = df[['winner']].copy()
方案2:遵循Pandas推荐的赋值规范
新增列时改用.loc索引器赋值,符合Pandas的官方语法要求:
# 把原来的两行赋值替换为下面的写法 df.loc[:, 'player_1_h2h'] = player_1_h2h df.loc[:, 'player_2_h2h'] = player_2_h2h
额外优化建议
你当前用循环计算两人历史交手胜负的逻辑,可以用Pandas内置的cumsum方法替代,代码更简洁执行效率也更高,和原有逻辑完全对齐:
# 替换掉原来的for i in range(1,n)的整段循环逻辑 # 逐行判断获胜方是否为p1,累加后偏移一位,保证第一场的历史胜场为0 df['player_1_h2h'] = df['winner'].eq(p1).cumsum().shift(fill_value=0) df['player_2_h2h'] = df['winner'].eq(p2).cumsum().shift(fill_value=0)
内容的提问来源于stack exchange,提问作者Tim R
相关产品推荐
相关产品推荐

