当两个数据帧都包含相同的行,但一个数据帧多次包含该行时,查找两个数据帧之间的差异

2024-04-23 11:10:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两只熊猫

df1

jon,12,NewYork
jon,12,NewYork
james,14,LA

df2

jon,12,NewYork
james,14,LA

我想对它们进行比较,得出如下差异

德尔塔夫

jon,12,NewYork

我尝试了pd.concat([df1,df2,df2],axis=0,sort=False).drop_duplicates(keep=False)当没有重复项时,这可以正常工作,但当一个数据帧包含重复项而另一个数据帧具有单个条目时,这不会产生差异。我还尝试了Python Pandas - Find difference between two data frames中提到的解决方案,但在本例中也返回空数据帧

类似问题

我认为这不是一个重复的问题,因为对于this question返回上述场景的空数据帧给出了一个答案

编辑

人们说这是不可能的。我们可以这样做吗:

添加一列,给出每行的出现次数

将以上df1转换为

jon,12,NewYork,2
james,14,LA,1

将以上df2转换为

jon,12,NewYork,1

现在我可以使用所有列作为索引并减去最后一列


Tags: 数据false差异sortladroppddf1
2条回答

您可以添加新列以捕获重复项:

df1['merge'] = df1.groupby(['0','1','2']).cumcount()

df2['merge'] = df2.groupby(['0','1','2']).cumcount()

pd.concat([df1,df2]).drop_duplicates(keep=False)

之后,可以再次删除添加的列

df1 = pd.DataFrame({
    'name': ('jon', 'jon', 'james'),
    'age': (12, 12, 14),
    'city': ('NewYork', 'NewYork', 'LA'),
})

df2 = pd.DataFrame({
    'name': ('jon', 'james'),
    'age': (12, 14),
    'city': ('NewYork', 'LA'),
})


def unique_col(x):
    # generate record uniqueness criteria after grouping
    return ''.join([x['name'], str(x['age']), x['city'], str(x['counter'])])


# calculation of the same items
df1['counter'] = df1.groupby(['name', 'age', 'city']).cumcount() + 1
df2['counter'] = df2.groupby(['name', 'age', 'city']).cumcount() + 1
# unique key after grouped counters
df1['unique_key'] = df1.apply(unique_col, axis=1)
df2['unique_key'] = df2.apply(unique_col, axis=1)
# select items by unique key
df = df1[~df1['unique_key'].isin(df2['unique_key'].tolist())]
df = df.drop(columns=['counter', 'unique_key'])
print(df)

#  name  age     city
#1  jon   12  NewYork

见评论。希望这有帮助

相关问题 更多 >