Pandas异列长DataFrame匹配mrn字段填充race列缺失值方法
解决方案
核心思路是先提取mrn2与race2的唯一对应关系构建映射表,再用mrn1匹配映射表填充空值即可,完整代码如下:
import pandas as pd # 原始DataFrame构造代码 data = {'mrn1':[1,1,1,2,2,3,3,3,4], 'race1':['', '', '', 'white', 'white', 'black', 'black', 'black', ''], 'mrn2':[1,1,3,3,4,6], 'race2':['black', 'black','black','black', 'white', 'white']} dfx = pd.DataFrame.from_dict(data, orient='index') dfx = dfx.transpose() # 1. 构建mrn到race的唯一映射表,排除空值行 mrn_race_map = dfx.dropna(subset=['mrn2', 'race2'])\ .drop_duplicates('mrn2')\ .set_index('mrn2')['race2']\ .to_dict() # 2. 生成race3列:优先取race1非空值,空值用mrn1匹配映射表的结果填充 dfx['race3'] = dfx['race1'].replace('', pd.NA)\ .fillna(dfx['mrn1'].map(mrn_race_map)) # 查看输出结果 print(dfx)
逻辑说明
- 构建映射表时先剔除
mrn2和race2的空值行,再按mrn2去重,保证每个mrn对应唯一的race值 - 生成
race3时先把race1里的空字符串转为pandas空值,再用fillna方法匹配填充,完全符合需求规则 - 如果实际场景中存在单个
mrn2对应多个race2的情况,可在去重步骤前增加分组聚合逻辑(比如取出现频次最高的race值)即可适配
内容的提问来源于stack exchange,提问作者user3885754
相关产品推荐
相关产品推荐

