为了账号安全,请及时绑定邮箱和手机立即绑定

比较两个数据框并获得差异

比较两个数据框并获得差异

四季花海 2019-11-08 11:16:11
我有两个数据框。例子:df1:Date       Fruit  Num  Color 2013-11-24 Banana 22.1 Yellow2013-11-24 Orange  8.6 Orange2013-11-24 Apple   7.6 Green2013-11-24 Celery 10.2 Greendf2:Date       Fruit  Num  Color 2013-11-24 Banana 22.1 Yellow2013-11-24 Orange  8.6 Orange2013-11-24 Apple   7.6 Green2013-11-24 Celery 10.2 Green2013-11-25 Apple  22.1 Red2013-11-25 Orange  8.6 Orange每个数据框都有“日期”作为索引。两个数据帧具有相同的结构。我想要做的是比较这两个数据帧,并找到df2中哪些行不在df1中。我想比较日期(索引)和第一列(香蕉,APple等),以查看它们是否存在于df2与df1中。我尝试了以下方法:并排输出两个熊猫数据帧中的差异-突出显示差异比较两个熊猫数据框的差异对于第一种方法,我收到此错误:“异常:只能比较标记相同的DataFrame对象”。我尝试删除日期作为索引,但得到相同的错误。在第三种方法上,我得到断言返回False,但是无法弄清楚如何实际看到不同的行。任何指针都将受到欢迎
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这种方法df1 != df2仅适用于具有相同行和列的数据帧。实际上,所有数据帧轴都与_indexed_same方法进行了比较,如果发现差异(即使是按列/索引的顺序),也会引发异常。


如果我说对了,那么您不希望找到变化,而是希望找到对称的差异。为此,一种方法可能是连接数据帧:


>>> df = pd.concat([df1, df2])

>>> df = df.reset_index(drop=True)

通过...分组


>>> df_gpby = df.groupby(list(df.columns))

获取唯一记录的索引


>>> idx = [x[0] for x in df_gpby.groups.values() if len(x) == 1]

过滤


>>> df.reindex(idx)

         Date   Fruit   Num   Color

9  2013-11-25  Orange   8.6  Orange

8  2013-11-25   Apple  22.1     Red


查看完整回答
反对 回复 2019-11-08
?
HUX布斯

TA贡献1876条经验 获得超6个赞

在alko的答案几乎对我有用的基础上,除了过滤步骤(我得到了:)ValueError: cannot reindex from a duplicate axis,这是我使用的最终解决方案:


# join the dataframes

united_data = pd.concat([data1, data2, data3, ...])

# group the data by the whole row to find duplicates

united_data_grouped = united_data.groupby(list(united_data.columns))

# detect the row indices of unique rows

uniq_data_idx = [x[0] for x in united_data_grouped.indices.values() if len(x) == 1]

# extract those unique values

uniq_data = united_data.iloc[uniq_data_idx]


查看完整回答
反对 回复 2019-11-08
  • 3 回答
  • 0 关注
  • 524 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信