pandas如何基于ID字段合并两个DataFrame并保持原数据维度
问题原因
你直接调用pd.merge(dataframe1,dataframe2, on = 'ID')执行的是同ID值下的笛卡尔积匹配:
- dataframe1中ID=123有3条记录、ID=456有3条记录
- dataframe2中ID=123、ID=456也各有3条记录
直接按ID合并会生成3*3 + 3*3 = 18行结果,和你预期的6行输出不符。
实现方法
要实现同ID下记录逐行对齐合并、最终输出6行结果,只需要给两个表按ID分组后添加组内行序号,将「ID+组内序号」作为联合合并键即可,步骤如下:
- (可选)如果需要严格匹配你给出的目标输出顺序,先对dataframe2按字段排序:
import pandas as pd dataframe2 = dataframe2.sort_values(by=['ID', 'ROW', 'LOCATION']).reset_index(drop=True)
- 给两个表分别添加ID分组内的行序号辅助列:
dataframe1['match_idx'] = dataframe1.groupby('ID').cumcount() dataframe2['match_idx'] = dataframe2.groupby('ID').cumcount()
- 按ID和辅助序号列合并,最后删除辅助列即可得到结果:
result = pd.merge( dataframe1, dataframe2, on=['ID', 'match_idx'] ).drop('match_idx', axis=1)
如果需要列顺序和示例完全一致,最后加一步列重排即可:
result = result[['ID', 'ROW', 'LOCATION', 'Attr1', 'Attr2', 'Attr3']]
运行后输出和你给出的目标结构完全一致:
ID ROW LOCATION Attr1 Attr2 Attr3 0 123 1 A ABC DEF GHI 1 123 2 A ABC DEF GHI 2 123 2 B ABC DEF GHI 3 456 1 B JKL MNO PQR 4 456 1 C JKL MNO PQR 5 456 2 C JKL MNO PQR
内容的提问来源于stack exchange,提问作者python_stat
相关产品推荐
相关产品推荐

