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

如何基于ID匹配为DataFrame追加对应列值并保留重复ID

解决方法:基于ID匹配为DataFrame追加对应列

没问题,这事儿用pandas的merge()方法就能完美解决——它会自动处理df2里的重复ID,完全保留所有行的同时,把df1中对应ID的type值准确匹配上去。

具体实现步骤

  1. 核心思路:使用左连接(Left Join),以df2为左表,确保保留df2的所有行(包括重复ID的行),然后通过id列匹配df1中的type值。
  2. 代码实现:
import pandas as pd

# 初始化df1
data1 = [[1283, 234, 8], [1313, 155, 4], [1837, 987,6], [1443, 200, 0], [1923, 224, 1], [1912, 247, 7], [1176, 228, 2], [1865, 248, 6], [1219, 265, 3], [1255, 862, 1]]
df1 = pd.DataFrame(data1, columns=['id', 'type', 'qty'])

# 初始化df2
data2 =[[1313, 0], [1313,0], [1443, 0], [1176,0], [1912,1], [1912,1], [1912, 1], [1283, 0], [1837, 1], [1837, 1], [1837, 1], [1923, 0], [1865, 0], [1865, 0], [1219, 1], [1255,1]]
df2 = pd.DataFrame(data2, columns=['id', 'class'])

# 执行匹配:左连接,保留df2所有行,匹配df1的type列
df2_with_type = pd.merge(df2, df1[['id', 'type']], on='id', how='left')

# 查看结果
print(df2_with_type)

输出结果

你会得到完全符合预期的DataFrame:

id  class  type
0   1313      0   155
1   1313      0   155
2   1443      0   200
3   1176      0   228
4   1912      1   247
5   1912      1   247
6   1912      1   247
7   1283      0   234
8   1837      1   987
9   1837      1   987
10  1837      1   987
11  1923      0   224
12  1865      0   248
13  1865      0   248
14  1219      1   265
15  1255      1   862

关键细节解释

  • how='left':这是核心参数,确保左表(df2)的所有行都被保留,即使右表(df1)中没有匹配项(不过你的场景里df2的ID应该都在df1里,所以不会出现NaN)。
  • df1[['id', 'type']]:只选取df1中需要的列进行匹配,避免把不需要的qty列也合并进来。
  • 重复ID处理:左连接会自动为df2中的每个重复ID匹配对应的type值,完美满足你“不能删除重复项”的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:28:12