You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于指定列对齐两个不同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)

id1id2var1
11.0B
11.0B
1NaNNaN
22.0W
22.0W
33.0H
3NaNNaN
3NaNNaN
3NaNNaN
44.0B
6NaNNaN
6NaNNaN

逻辑说明

  • 组内序号可以实现同ID下的行按位置一一匹配,不会出现多对多连接的乱序问题
  • 左连接完全保留df1的所有行,df2中同ID行数超过df1的部分无对应匹配项会被自动舍弃,完全无匹配的ID(如示例中的id2=5)也会被过滤,完全符合你提出的4项要求。

内容的提问来源于stack exchange,提问作者user3885754

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:39:03