如何基于ID匹配为DataFrame追加对应列值并保留重复ID
解决方法:基于ID匹配为DataFrame追加对应列
没问题,这事儿用pandas的merge()方法就能完美解决——它会自动处理df2里的重复ID,完全保留所有行的同时,把df1中对应ID的type值准确匹配上去。
具体实现步骤
- 核心思路:使用左连接(Left Join),以df2为左表,确保保留df2的所有行(包括重复ID的行),然后通过
id列匹配df1中的type值。 - 代码实现:
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
相关产品推荐
相关产品推荐

