比较两个 DataFrame 并并排输出它们的差异

新手上路,请多包涵

我试图准确突出两个数据帧之间的变化。

假设我有两个 Python Pandas 数据框:

 "StudentRoster Jan-1":
id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 He was late to class
112  Nick   1.11                     False                Graduated
113  Zoe    4.12                     True

"StudentRoster Jan-2":
id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 He was late to class
112  Nick   1.21                     False                Graduated
113  Zoe    4.12                     False                On vacation

我的目标是输出一个 HTML 表格:

  1. 标识已更改的行(可以是 int、float、boolean、string)
  2. 输出具有相同的旧值和新值的行(理想情况下输出到 HTML 表中),以便消费者可以清楚地看到两个数据帧之间发生了什么变化:
    "StudentRoster Difference Jan-1 - Jan-2":
   id   Name   score                    isEnrolled           Comment
   112  Nick   was 1.11| now 1.21       False                Graduated
   113  Zoe    4.12                     was True | now False was "" | now   "On   vacation"

我想我可以逐行和逐列进行比较,但是有更简单的方法吗?

原文由 sky 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

第一部分和Constantine类似,可以得到哪些行为空的boolean*:

 In [21]: ne = (df1 != df2).any(1)

In [22]: ne
Out[22]:
0    False
1     True
2     True
dtype: bool

然后我们可以看到哪些条目发生了变化:

 In [23]: ne_stacked = (df1 != df2).stack()

In [24]: changed = ne_stacked[ne_stacked]

In [25]: changed.index.names = ['id', 'col']

In [26]: changed
Out[26]:
id  col
1   score         True
2   isEnrolled    True
    Comment       True
dtype: bool

这里第一个条目是索引,第二个条目是已更改的列。

 In [27]: difference_locations = np.where(df1 != df2)

In [28]: changed_from = df1.values[difference_locations]

In [29]: changed_to = df2.values[difference_locations]

In [30]: pd.DataFrame({'from': changed_from, 'to': changed_to}, index=changed.index)
Out[30]:
               from           to
id col
1  score       1.11         1.21
2  isEnrolled  True        False
   Comment     None  On vacation

\* 注意:重要的是 df1df2 在这里共享相同的索引。为了克服这种歧义,您可以确保只使用 df1.index & df2.index 查看共享标签,但我想我会把它留作练习。

原文由 Andy Hayden 发布,翻译遵循 CC BY-SA 3.0 许可协议

突出显示两个 DataFrame 之间的差异

可以使用 DataFrame 样式属性来突出显示存在差异的单元格的背景颜色。

使用原始问题中的示例数据

第一步是使用 concat 函数水平连接数据帧,并使用 keys 参数区分每个帧:

 df_all = pd.concat([df.set_index('id'), df2.set_index('id')],
                   axis='columns', keys=['First', 'Second'])
df_all

在此处输入图像描述

交换列级别并将相同的列名称彼此相邻放置可能更容易:

 df_final = df_all.swaplevel(axis='columns')[df.columns[1:]]
df_final

在此处输入图像描述

现在,更容易发现帧中的差异。但是,我们可以更进一步,使用 style 属性来突出显示不同的单元格。我们定义了一个自定义函数来执行此操作,您可以在 文档的这一部分中 看到它。

 def highlight_diff(data, color='yellow'):
    attr = 'background-color: {}'.format(color)
    other = data.xs('First', axis='columns', level=-1)
    return pd.DataFrame(np.where(data.ne(other, level=0), attr, ''),
                        index=data.index, columns=data.columns)

df_final.style.apply(highlight_diff, axis=None)

在此处输入图像描述

这将突出显示均具有缺失值的单元格。您可以填充它们或提供额外的逻辑,这样它们就不会被突出显示。

原文由 Ted Petrou 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题