基于参考表按特定行列规则填充DataFrame中的NaN值
解决Pandas DataFrame按参考表填充缺失值的问题
先定义示例数据(贴合你的场景)
假设你的参考表ref和业务表df结构如下:
import pandas as pd # 参考表:存储人员固定的Target和Bonus ref = pd.DataFrame({ 'Name': ['Joe', 'Phil', 'Dean'], 'Target': [100, 120, 90], 'Bonus': [20, 25, 18] }) # 业务表:含周次数据,部分字段为NaN df = pd.DataFrame({ 'Name': ['Joe', 'Joe', 'Phil', 'Dean', 'Dean'], 'Week': [1, 2, 1, 1, 2], 'Target': [100, pd.NA, pd.NA, 90, pd.NA], 'Bonus': [pd.NA, 20, pd.NA, pd.NA, 18], 'Score': [85, pd.NA, 110, pd.NA, pd.NA] })
分步实现填充逻辑
- 构建人员与固定值的映射字典
把参考表转换成以Name为键的字典,方便快速匹配填充:
target_map = ref.set_index('Name')['Target'].to_dict() bonus_map = ref.set_index('Name')['Bonus'].to_dict()
- 填充Target和Bonus的缺失值
用fillna结合map,根据人员匹配参考表的固定值:
df['Target'] = df['Target'].fillna(df['Name'].map(target_map)) df['Bonus'] = df['Bonus'].fillna(df['Name'].map(bonus_map))
- 填充Score的缺失值为对应人员的Target
此时Target已经补全,直接用当前行的Target值填充Score的NaN:
df['Score'] = df['Score'].fillna(df['Target'])
最终输出结果
执行上述代码后,df的结果如下:
Name Week Target Bonus Score 0 Joe 1 100 20 85.0 1 Joe 2 100 20 100.0 2 Phil 1 120 25 110.0 3 Dean 1 90 18 90.0 4 Dean 2 90 18 90.0
补充说明
如果你的数据量较大,这种基于字典映射的方法效率很高;如果需要更复杂的关联逻辑,也可以用pd.merge将参考表和业务表关联后填充,但对于当前场景,字典映射是最简洁的方案。
内容的提问来源于stack exchange,提问作者PineNuts0
相关产品推荐
相关产品推荐

