熊猫:比较两个有重复数据的数据帧

时间:2018-03-11 16:03:23

标签: pandas

我有两个数据框,一个有重复数据。我宁愿保留输出中的一个重复项。

import pandas as pd
df1 = pd.DataFrame(data = {'col1' : ['M', 'M', 'M', 'M', 'C','C','C'], 'col2' : [10.5,11.5,14,15.5,51,51,52]}) 
df2 = pd.DataFrame(data = {'col1' : ['M', 'C', 'C'], 'col2' : [10.5, 51, 52]})

首选输出是

M    11.5       
M    14    
M    15.5    
C    51 

因为在df1中有两行,其中51用于C,任何合并操作都会删除或保留两行。

2 个答案:

答案 0 :(得分:1)

您可以合并concat + drop_duplicates,我使用cumcount创建的新密钥仅用于每次删除多行

s=pd.concat([df1,df2],keys=['df1','df2'])

s.assign(cumcount=s.groupby([s.index.get_level_values(0),s.col1,s.col2]).cumcount()).\  
   drop_duplicates(keep=False).\
     reset_index(level=0,drop=True).\
       drop('cumcount',1)
Out[127]: 
  col1  col2
1    M  11.5
2    M  14.0
3    M  15.5
5    C  51.0

答案 1 :(得分:1)

使用Counter库中的collections 这假设OP想要从第一个数据帧中删除在第二个数据帧中找到的唯一对的数量。见Pandas: Compare two data frames that have duplicates

from collections import Counter

pd.DataFrame(list(
    (Counter(map(tuple, df1.values)) -
     Counter(map(tuple, df2.values))).keys()
), columns=['col1', 'col2'])

  col1  col2
0    M  11.5
1    M  14.0
2    M  15.5
3    C  51.0

​