我有两个数据框,一个有重复数据。我宁愿保留输出中的一个重复项。
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,任何合并操作都会删除或保留两行。
答案 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