Pandas:如何逐行比较两个 dataframe


您可以使用以下方法逐行比较两个 pandas DataFrame:

方法 1:比较 DataFrame 并仅保留有差异的行

 df_diff = df1. compare (df2, keep_equal= True , align_axis= 0 )

方法 2:比较 DataFrame 并保留所有行

 df_diff = df1. compare (df2, keep_equal= True , keep_shape= True , align_axis= 0 )

以下示例展示了如何将每种方法与以下 pandas DataFrame 一起使用:

 import pandas as pd

#create first DataFrame
df1 = pd. DataFrame ({' team ': ['A', 'B', 'C', 'D'],
                    ' points ': [18, 22, 19, 14],
                    ' assists ': [5, 7, 7, 9]})

print (df1)

  team points assists
0 to 18 5
1 B 22 7
2 C 19 7
3 D 14 9

#create second DataFrame
df2 = pd. DataFrame ({' team ': ['A', 'B', 'C', 'E'],
                    ' points ': [18, 30, 19, 20],
                    ' assists ': [5, 7, 7, 9]})

print (df2)

  team points assists
0 to 18 5
1 B 30 7
2 C 19 7
3 E 20 9

示例 1:比较 DataFrame 并仅保留有差异的行

下面的代码展示了如何逐行比较两个 DataFrame 并仅保留至少一列中存在差异的行:

 #compare DataFrames and only keep rows with differences
df_diff = df1. compare (df2, keep_equal= True , align_axis= 0 )

#view results
print (df_diff)

        team points
1 coil B 22
  other B 30
3 choke D 14
  other E 20

我们可以看到 DataFrame 有两个不同的行。

特别是,我们可以看到每个DataFrame的索引位置1和3处的行至少有一列具有不同的值。

self行中的值显示第一个 DataFrame 的值,而另一行中的值显示第二个 DataFrame 的值。

例如,我们可以看到:

  • 第一个 DataFrame 索引位置 1 处的行在球队列中包含B ,在点数列中包含22
  • 第二个 DataFrame 索引位置 1 处的行在球队列中包含B ,在点数列中包含30

注意keep_equal=True参数告诉 pandas 保持值相等。否则,相等的值将显示为 NaN。

示例 2:比较 DataFrame 并保留所有行

以下代码演示了如何使用keep_shape=True参数逐行比较两个 DataFrame 并保留原始 DataFrame 中的所有行:

 #compare DataFrames and keep all rows
df_diff = df1. compare (df2, keep_equal= True , keep_shape= True , align_axis= 0 )

#view results
print (df_diff)

        team points assists
0 choke A 18 5
  other A 18 5
1 coil B 22 7
  other B 30 7
2 choke C 19 7
  other C 19 7
3 choke D 14 9
  other E 20 9

生成的 DataFrame 包含原始 DataFrame 的所有行和列。

注意#1compare()函数假设两个 DataFrame 具有相同的维度。

注意#2:您可以在此处找到 pandas Compare()函数的完整文档。

其他资源

以下教程解释了如何在 pandas 中执行其他常见任务:

Pandas:如何比较两列
Pandas:如何比较三列
Pandas:如何比较两个不同 DataFrame 中的列

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注