假设我有两个如下所示的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
感谢大家的辛勤工作。
答案 0 :(得分:3)
在添加的列中,GroupBy.cumcount
和merge
中的计数器列都使用https://regex101.com/r/bXMmFP/1:
DataFrames
与另一种解决方案的不同之处在于,第二个df秒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
到10
的变化数据中的最佳观看效果-它纠正了11
中第一个重复对a, b
与第一个{ {1}}从第二秒开始,所有重复项和唯一对相似:
df1
答案 1 :(得分:1)
您可以在合并之前删除重复的行
df = pd.merge(
df1.drop_duplicates(),
df2.drop_duplicates(),
on=['a', 'b'], how='inner'
)
print(df)
# a b c d
# 0 0 3 6 10
# 1 0 3 7 10
# 2 1 4 8 12
# 3 2 5 9 13
答案 2 :(得分:1)
您还可以在合并后删除重复项
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)
df3 = pd.merge(df1, df2, how='inner', on=['a', 'b']).drop_duplicates()
df3:
a b c d
0 0 3 6 10
2 0 3 7 10
4 1 4 8 12
5 2 5 9 13