假设我有两个 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
