Skip to main content
 首页 » 编程设计

python之pandas merge df many to many without duplicates

2025年05月04日18lonelyxmas

假设我有两个 df,如下所示:

import pandas as pd 
 
data_dic = { 
    "a": [0,0,1,2], 
    "b": [3,3,4,5], 
    "c": [6,7,8,9] 
} 
df1 = pd.DataFrame(data_dic) 
 
data_dic = { 
    "a": [0,0,1,2], 
    "b": [3,3,4,5], 
    "d": [10,10,12,13] 
} 
df2 = pd.DataFrame(data_dic) 

结果:

df1

   a  b  c 
0  0  3  6 
1  0  3  7 
2  1  4  8 
3  2  5  9 

df2

   a  b   d 
0  0  3  10 
1  0  3  10 
2  1  4  12 
3  2  5  13 

其中每个 df 在“a”和“b”列上具有相同的键值。

问:如何合并不重复? [合并 df 然后删除重复项的选项不令人满意]

我尝试使用以下代码来执行此操作,但这会创建重复行并显着增加文件容量。

df = pd.merge(df1, df2, on=['a', 'b'] , how='left', validate='many_to_many') 
df = pd.merge(df1, df2, on=['a', 'b'] , how='inner') 

预期结果:

   a  b  c   d 
0  0  3  6  10 
1  0  3  7  10 
2  1  4  8  12 
3  2  5  9  13 

感谢大家的辛勤工作。

请您参考如下方法:

使用 GroupBy.cumcount 对于 DataFrames 中的计数器列与 merge 通过添加列:

df1['g'] = df1.groupby(['a','b']).cumcount() 
df2['g'] = df2.groupby(['a','b']).cumcount() 
 
df = pd.merge(df1, df2, on=['a', 'b', 'g'] , how='inner') 
print (df) 
   a  b  c  g   d 
0  0  3  6  0  10 
1  0  3  7  1  10 
2  1  4  8  0  12 
3  2  5  9  0  13 

与其他解决方案的区别最好在第二个 df 秒中更改的数据中看到 10至 11 - 它通过第一个重复对正确合并 a, b来自 df1首先a, b从第二个开始,所有重复项和唯一对都相似:

data_dic = { 
    "a": [0,0,1,2], 
    "b": [3,3,4,5], 
    "d": [10,11,12,13] 
} 
df2 = pd.DataFrame(data_dic) 
 
 
df1['g'] = df1.groupby(['a','b']).cumcount() 
df2['g'] = df2.groupby(['a','b']).cumcount() 
 
df = pd.merge(df1, df2, on=['a', 'b', 'g'] , how='inner') 
print (df) 
 
   a  b  c  g   d 
0  0  3  6  0  10 
1  0  3  7  1  11 
2  1  4  8  0  12 
3  2  5  9  0  13