Pandas如何使用另一个DataFrame更新主DataFrame的指定缺失值
问题分析
- 合并操作错误:
pd.merge()的on参数需要传入列名字符串而非列Series,错误的传参方式、以及两份数据中存在重复的player_id都会触发重复值报错。同时merge操作会生成包含age_x、age_y两套年龄列的新表,无法直接完成对原表缺失值的更新。 - 遍历赋值错误:
df_master.age[df_master.player_id == i]属于链式索引写法,pandas无法判断操作对象是原表还是切片副本,因此会抛出Copy on a slice警告。且遍历方式时间复杂度高,数据集规模扩大后性能会很差。
正确实现方案
推荐用映射更新的方式,代码简洁且性能更高:
import pandas as pd import numpy as np # 读取补全数据时可添加index_col=0去掉导出时产生的多余索引列 filled_ages = pd.read_csv('filled_ages.csv', index_col=0) # 构造player_id到补全年龄的映射字典 age_map = filled_ages.set_index('player_id')['age'].to_dict() # 仅更新原主表中age为空的位置,不影响已有的有效值 df_master.loc[df_master['age'].isna(), 'age'] = df_master.loc[df_master['age'].isna(), 'player_id'].map(age_map)
如果确认filled_ages中player_id无重复,也可以用索引对齐的方式更新:
# 临时将两份表的索引设为player_id对齐 df_master = df_master.set_index('player_id') filled_ages = filled_ages.set_index('player_id') # 用补全数据填充原表缺失值 df_master['age'] = df_master['age'].fillna(filled_ages['age']) # 恢复原表的默认索引 df_master = df_master.reset_index()
注意事项
操作前可先校验filled_ages['player_id'].nunique() == len(filled_ages),确认补全数据中没有重复的玩家id,避免更新时出现值覆盖错误。
内容的提问来源于stack exchange,提问作者IridianDreamer
相关产品推荐
相关产品推荐

