如何基于指定列对齐两个不同pandas DataFrame并按规则插入NaN补全?
实现方案
核心思路是给两个DataFrame的同ID行添加组内序号作为匹配辅助键,再通过左连接实现精准对齐,避免笛卡尔积导致的行堆叠问题,代码如下:
import pandas as pd # 样例输入数据 df1 = pd.DataFrame({'id1': [1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 6, 6]}) df2 = pd.DataFrame({'id2': [1, 1, 2, 2, 2, 2, 3, 4, 5], 'var1': ['B', 'B', 'W', 'W', 'W', 'W', 'H', 'B', 'A']}) # 为同ID的行生成组内序号,作为辅助匹配键 df1['group_idx'] = df1.groupby('id1').cumcount() df2['group_idx'] = df2.groupby('id2').cumcount() # 左连接对齐,保留df1所有行,自动过滤df2多余行 df3 = df1.merge( df2, left_on=['id1', 'group_idx'], right_on=['id2', 'group_idx'], how='left' ).drop('group_idx', axis=1) # 删除辅助列
输出结果(df3)
| id1 | id2 | var1 |
|---|---|---|
| 1 | 1.0 | B |
| 1 | 1.0 | B |
| 1 | NaN | NaN |
| 2 | 2.0 | W |
| 2 | 2.0 | W |
| 3 | 3.0 | H |
| 3 | NaN | NaN |
| 3 | NaN | NaN |
| 3 | NaN | NaN |
| 4 | 4.0 | B |
| 6 | NaN | NaN |
| 6 | NaN | NaN |
逻辑说明
- 组内序号可以实现同ID下的行按位置一一匹配,不会出现多对多连接的乱序问题
- 左连接完全保留df1的所有行,df2中同ID行数超过df1的部分无对应匹配项会被自动舍弃,完全无匹配的ID(如示例中的id2=5)也会被过滤,完全符合你提出的4项要求。
内容的提问来源于stack exchange,提问作者user3885754
相关产品推荐
相关产品推荐

