如何在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)
代码解释
- 添加组内序号:
groupby('Item').cumcount()会为每个Item分组内的行生成从0开始的连续编号,比如ABC分组的三行序号分别是0、1、2,这样每个行就有了唯一的「分组内标识」。 - 多键合并:用
Item+seq作为合并键,确保两个DataFrame中同Item且同组内序号的行精确匹配,彻底避免了笛卡尔积问题。 - 整理输出:删除辅助的
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
相关产品推荐
相关产品推荐

