大熊猫将df合并到很多,没有重复

时间:2019-08-08 06:30:24

标签: python pandas dataframe

假设我有两个如下所示的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

感谢大家的辛勤工作。

3 个答案:

答案 0 :(得分:3)

在添加的列中,GroupBy.cumcountmerge中的计数器列都使用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