按Name分组填充Critic Score缺失值时触发SettingWithCopyWarning警告的问题求助
解决Pandas分组填充缺失值时的SettingWithCopyWarning警告
警告产生的原因
这个警告本质上是Pandas在给你提个醒:你正在修改的对象大概率是某个原始DataFrame的视图(切片结果),而非独立的副本。比如你的games或者dupliacted_games,应该是通过类似original_df[original_df['some_col'] == xxx]这种切片操作得到的。Pandas没法确定你到底想修改原始数据,还是只修改这个临时切片出来的对象,所以抛出警告防止你出现意外的数据修改操作。
有效的解决方法
我给你两种思路,优先推荐第一种从根源解决的方案:
方案1:显式创建副本 + 优化填充逻辑
先确保你操作的是独立的DataFrame副本,再调整填充代码的写法,彻底规避视图冲突:
# 第一步:给涉及的DataFrame创建显式副本,切断和原始数据的视图关联 dupliacted_games = dupliacted_games.copy() games = games.copy() # 第二步:定义分组填充的逻辑函数 def fill_group_rating(x): # 获取分组内的众数,同时处理分组内全为空的情况 group_mode = x.value_counts().idxmax() if not x.value_counts().empty else mode return x.fillna(group_mode) # 用transform替代apply,更适配这种对齐赋值的场景 games['Rating'] = dupliacted_games.groupby('Name')['Rating'].transform(fill_group_rating) # 最后填充剩余未覆盖的缺失值 global_rating_mode = dupliacted_games['Rating'].value_counts().idxmax() games['Rating'] = games['Rating'].fillna(global_rating_mode)
为什么这么改?
.copy()会生成一个完全独立的DataFrame,Pandas能明确你是在修改这个副本,不会再触发视图相关的警告。transform方法会返回和原数据长度一致的结果,自动对齐索引,比apply更适合这种需要赋值回原DataFrame的场景,还能减少索引不匹配的风险。
方案2:临时屏蔽警告(不推荐)
如果你只是想临时隐藏警告,不想调整代码逻辑,可以用这个方法,但不建议长期使用——因为它只是掩盖问题,并没有解决视图修改的潜在风险:
import pandas as pd pd.options.mode.chained_assignment = None # 关闭链式赋值警告
内容的提问来源于stack exchange,提问作者Mr_12
相关产品推荐
相关产品推荐

