基于公共ID列值设置DataFrame索引并填充缺失值
问题分析
你遇到的核心问题是原始DataFrame的结构是多组ID-数值对(每两列一组,分别对应不同的指标列),而你之前的代码只处理了单一ID列,无法整合所有分散在不同组里的ID和对应数值。我们需要先拆分这些分组,再将它们合并成统一的以ID为索引的结构。
解决方案步骤
- 拆分原始数据为多个独立的小DataFrame,每个小DataFrame对应一组ID和指标列;
- 为每个小DataFrame设置
ID为索引,确保指标列与ID正确关联; - 使用**外连接(outer join)**合并所有小DataFrame,这样所有出现过的ID都会被保留,缺失的数值自动填充为
NaN(即你需要的NA)。
具体代码实现
假设你的原始DataFrame已经加载为df,可以按以下步骤操作:
import pandas as pd # 1. 拆分原始数据为四个独立的ID-指标组 df_mahaceb = df.iloc[:, [0, 1]].rename(columns={'ID': 'ID', 1: 'MAHACEB'}).drop_duplicates(subset='ID') df_moropex = df.iloc[:, [2, 3]].rename(columns={'ID': 'ID', 3: 'MOROPEX'}).drop_duplicates(subset='ID') df_otx01 = df.iloc[:, [4, 5]].rename(columns={'ID': 'ID', 5: 'OTX01'}).drop_duplicates(subset='ID') df_mapoxub = df.iloc[:, [6, 7]].rename(columns={'ID': 'ID', 7: 'MAPOXUB'}).drop_duplicates(subset='ID') # 2. 为每个小DataFrame设置ID为索引 df_mahaceb = df_mahaceb.set_index('ID') df_moropex = df_moropex.set_index('ID') df_otx01 = df_otx01.set_index('ID') df_mapoxub = df_mapoxub.set_index('ID') # 3. 外连接合并所有DataFrame final_df = df_mahaceb.join([df_moropex, df_otx01, df_mapoxub], how='outer') # 查看最终结果 print(final_df)
结果说明
运行上述代码后,你会得到期望的结构:所有出现过的ID作为索引,四个指标列对应填充数值,未匹配到的位置自动填充NaN。示例结果如下:
MAHACEB MOROPEX OTX01 MAPOXUB ID A0AVT1 48.0 23.0 NaN 38.0 A0FGR8 35.0 19.0 NaN 10.0 A0JLT2 28.0 50.0 NaN 56.0 A0JNW5 35.0 23.0 NaN 26.0 A0MZ66 37.0 98.0 NaN 21.0 A0PJW6 48.0 27.0 NaN 29.0 A0A0B4J2F0 NaN NaN 22.0 NaN A0A0U1RRE5 NaN NaN 3.0 NaN A0A1B0GUS4 NaN NaN 10.0 NaN A0AV96 NaN NaN 71.0 NaN A0AVF1 NaN NaN 40.0 NaN A0AVT1 NaN NaN 12.0 NaN
补充说明
- 使用
drop_duplicates(subset='ID')是为了避免同一ID在同一指标组里出现多次(如果原始数据有重复的话),如果你的数据没有重复,这一步可以省略; join()方法默认是左连接,这里指定how='outer'可以确保所有ID都被保留,不管它在哪个组里出现过。
内容的提问来源于stack exchange,提问作者ARJ
相关产品推荐
相关产品推荐

