基于Team匹配从参考DataFrame填充目标DataFrame全缺失行的NaN
解决方案:按Team匹配填充全缺失玩家数据
首先我们先还原示例中的输入数据(基于Pandas实现):
import pandas as pd import numpy as np # 构建fallback参考表 fallback = pd.DataFrame( { 'Morning': [4, 7, 9], 'Afternoon': [6, np.NaN, 1], 'Evening': [13, 9, 2] }, index=['Red', 'Blue', 'Green']) # 构建players数据表并计算Total列 players = pd.DataFrame({ 'Player': ['Bill', 'Emma', 'Mike', 'Jill'], 'Morning': [4, np.NaN, np.NaN, np.NaN], 'Afternoon': [np.NaN, np.NaN, 1, np.NaN], 'Evening': [13, np.NaN, np.NaN, np.NaN], 'Team': ['Red', 'Blue', 'Green', 'Red'] }) players['Total'] = players[['Morning', 'Afternoon', 'Evening']].sum(1)
接下来我们通过以下步骤实现需求:筛选出Total为0(即三列数据全部缺失)的行,再根据Team字段匹配fallback表的对应数据填充:
# 筛选需要填充的行:Total为0的玩家行 mask = players['Total'] == 0 # 按Team匹配fallback的数据,批量填充目标列 players.loc[mask, ['Morning', 'Afternoon', 'Evening']] = ( players.loc[mask, 'Team'] .map(fallback.to_dict('index')) .apply(pd.Series) ) # 可选:如果不需要Total列,可删除它 players = players.drop(columns='Total')
代码逻辑解释:
- 筛选条件
mask:通过players['Total'] == 0精准识别出三列数据全部缺失的玩家行,避免误填充部分缺失的行。 map(fallback.to_dict('index')):将fallback表转换为以Team为键的字典(格式示例:{'Red': {'Morning':4, 'Afternoon':6, ...}, ...}),再通过map把每个玩家的Team对应到字典中的完整数据。apply(pd.Series):把映射得到的字典序列转换为DataFrame格式,刚好匹配需要填充的三列结构,直接赋值给筛选后的行即可完成批量填充。
最终结果:
执行代码后,players数据表会变为:
| Player | Morning | Afternoon | Evening | Team |
|---|---|---|---|---|
| Bill | 4.0 | NaN | 13.0 | Red |
| Emma | 7.0 | NaN | 9.0 | Blue |
| Mike | NaN | 1.0 | NaN | Green |
| Jill | 4.0 | 6.0 | 13.0 | Red |
内容的提问来源于stack exchange,提问作者Josh Friedlander
相关产品推荐
相关产品推荐

