【问题标题】:Python : How to compare two data framesPython:如何比较两个数据框
【发布时间】:2015-12-08 16:31:16
【问题描述】:

我有两个数据框:

df1

A1    B1
1     a
2     s
3     d

df2

A1    B1
1     a
2     x
3     d

我想比较 B1 列上的 df1 和 df2。 A1 列可用于连接。我想知道:

  1. 相对于 B1 列,df1 和 df2 中的哪些行不同?
  2. 如果 A1 列的值不匹配。例如,df2 是否缺少 df1 中的某些值,反之亦然。如果有,是哪些?

我尝试使用合并和连接,但这不是我想要的。

【问题讨论】:

  • 1. df1['B1'] == df2['B1'] 2. 你能解释并发布所需的输出吗,因为我不清楚你的意思

标签: python pandas dataframe


【解决方案1】:

我已经编辑了原始数据以说明 A1 键在一个数据帧中而不是另一个数据帧中的情况。

在进行合并时,您希望指定一个“外部”合并,以便您可以在一个数据框中看到这些带有 A1 键的项目,而在另一个数据框中看不到这些项目。

我已包含后缀“_1”和“_2”以指示列 B1 的数据帧源(_1 = df1 和 _2 = df2)。

df1 = pd.DataFrame({'A1': [1, 2, 3, 4], 'B1': ['a', 'b', 'c', 'd']})
df2 = pd.DataFrame({'A1': [1, 2, 3, 5], 'B1': ['a', 'd', 'c', 'e']})

df3 = df1.merge(df2, how='outer', on='A1', suffixes=['_1', '_2'])
df3['check'] = df3.B1_1 == df3.B1_2

>>> df3
   A1 B1_1 B1_2  check
0   1    a    a   True
1   2    b    d  False
2   3    c    c   True
3   4    d  NaN  False
4   5  NaN    e  False

检查df1df2 中是否缺少A1 键:

# A1 value missing in `df1`
>>> d3[df3.B1_1.isnull()]
   A1 B1_1 B1_2  check
4   5  NaN    e  False

# A1 value missing in `df2`
>>> df3[df3.B1_2.isnull()]
   A1 B1_1 B1_2  check
3   4    d  NaN  False

编辑 感谢@EdChum(所有 Pandas 知识的来源......)。

df3 = df1.merge(df2, how='outer', on='A1', suffixes=['_1', '_2'], indicator=True)
df3['check'] = df3.B1_1 == df3.B1_2

>>> df3
   A1 B1_1 B1_2      _merge  check
0   1    a    a        both   True
1   2    b    d        both  False
2   3    c    c        both   True
3   4    d  NaN   left_only  False
4   5  NaN    e  right_only  False

【讨论】:

  • 如果使用最新版本的 pandas,您可以使用 pd.merge 并通过 indicator=True 添加一列以显示该行是否仅在左侧,右侧,两者
  • 完美!似乎正是我所需要的。小问题。当我在我的数据上尝试它时,我没有看到丢失的行。其中一个数据框中存在一些记录,合并后它们不会显示。但是,您的解决方案与您在此处提供的测试数据完美配合。谢谢
  • 知道为什么会发生这种情况吗?我正在从一些 csv 文件中读取数据
  • 您需要在遇到问题的地方发布数据,可能是作为一个新问题。
  • @EdChum 有没有办法比较多列?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2023-01-08
  • 2022-01-10
  • 2020-06-02
  • 1970-01-01
相关资源
最近更新 更多