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

如何在Python中基于字符串搜索合并两个Pandas DataFrame?解决合并后重复行问题

解决Pandas合并DataFrame出现重复行的问题

你遇到的是典型的笛卡尔积合并问题:因为两个DataFrame里Item='ABC'都包含3行,普通的pd.merge会把所有匹配Item的行两两组合,所以才会出现9行ABC的冗余结果。而你想要的是同Item下按行的顺序一一对应合并,这就需要给每个分组添加「组内序号」作为额外的合并键,实现精确匹配。

解决方案代码

import pandas as pd

# 初始化你的两个DataFrame
df1 = pd.DataFrame({
    'Item': ['ABC', 'ABC', 'ABC', 'CD', 'EF'],
    'ID': [1, 2, 3, 12, 11]
})

df2 = pd.DataFrame({
    'Name': ['Name1', 'Name2', 'Name 3', 'Name4'],
    'Item': ['ABC', 'ABC', 'ABC', 'CD'],
    'Price': [123.00, 110, 100, 50]
})

# 1. 给两个DataFrame添加组内序号:按Item分组后,对每组内的行从0开始计数
df1['seq'] = df1.groupby('Item').cumcount()
df2['seq'] = df2.groupby('Item').cumcount()

# 2. 用Item + 组内序号作为合并键,避免笛卡尔积
merged_df = pd.merge(df1, df2, on=['Item', 'seq'], how='outer')

# 3. 删除辅助序号列,调整列顺序到预期格式
merged_df = merged_df[['Name', 'Item', 'ID', 'Price']]

print(merged_df)

代码解释

  1. 添加组内序号:groupby('Item').cumcount()会为每个Item分组内的行生成从0开始的连续编号,比如ABC分组的三行序号分别是0、1、2,这样每个行就有了唯一的「分组内标识」。
  2. 多键合并:用Item+seq作为合并键,确保两个DataFrame中同Item且同组内序号的行精确匹配,彻底避免了笛卡尔积问题。
  3. 整理输出:删除辅助的seq列,调整列顺序后就得到了你想要的结果。

运行结果

Name Item  ID   Price
0   Name1  ABC   1  123.00
1   Name2  ABC   2  110.00
2  Name 3  ABC   3  100.00
3   Name4   CD  12   50.00
4     NaN   EF  11     NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:17:44