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

在Python中匹配两个含重复值的DataFrame,用NaN填充缺失项

需求说明

我有两个包含重复值且大小不同的DataFrame,需要在Python中实现按匹配值的出现顺序关联,将第二个DataFrame的col2值对应填充到第一个DataFrame中,无匹配项的位置填充NaN。

输入DataFrame

第一个DataFrame(df1):

col1
0      1
1      2
2      3
3      4
4      5
5      1
6      2
7      3
8      4
9      5
10     1
11     2
12     3
13     4
14     5

第二个DataFrame(df2):

col1  col2
0     1     2
1     2    23
2     4    45
3     2    67
4     3    12
5     5    91
6     1    21
7     2    23
8     5    43

期望输出

最终得到的DataFrame如下:

col1  col2
0      1   2.0
1      2  23.0
2      3  12.0
3      4  45.0
4      5  91.0
5      1  21.0
6      2  67.0
7      3   NaN
8      4   NaN
9      5  43.0
10     1   NaN
11     2  23.0
12     3   NaN
13     4   NaN
14     5   NaN
实现代码

可以通过为两个DataFrame添加组内序号,再基于col1和组内序号进行合并来实现需求:

import pandas as pd

# 构造输入的两个DataFrame
df1 = pd.DataFrame({'col1': [1,2,3,4,5]*3})
df2 = pd.DataFrame({
    'col1': [1,2,4,2,3,5,1,2,5],
    'col2': [2,23,45,67,12,91,21,23,43]
})

# 为df1添加组内序号:按col1分组后,每组内的行号
df1['seq'] = df1.groupby('col1').cumcount()
# 为df2添加组内序号:同样按col1分组后,每组内的行号
df2['seq'] = df2.groupby('col1').cumcount()

# 基于col1和seq进行左合并,然后删除seq列
result = df1.merge(df2, on=['col1', 'seq'], how='left').drop('seq', axis=1)

print(result)

代码说明

  1. groupby('col1').cumcount():为每个col1分组内的行分配从0开始的连续序号,标记每个值在组内的出现顺序。
  2. merge(..., how='left'):以df1为基准,将df2中col1和序号都匹配的col2值填充进来,无匹配的位置自动填充NaN。
  3. 最后删除辅助的seq列,得到目标结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:06:17