两个熊猫数据帧的逐元素比较

时间:2020-05-09 03:00:45

标签: python python-3.x pandas dataframe

我正在尝试比较熊猫中的两列。我知道我可以做到:

# either using Pandas' equals()
df1[col].equals(df2[col])
# or this
df1[col] == df2[col]

但是,我要寻找的是比较这些列,并在它们不匹配时将两个值都打印出来。我尝试过:

if df1[col] != df2[col]:
    print(df1[col])
    print(df2[col])

出现“系列的真值不明确”的错误 我相信这是因为该列被视为用于比较的一系列布尔值,这导致了歧义。我还尝试了各种形式的for循环,但均未解决问题。 谁能指出我应该如何去做我描述的事情?

3 个答案:

答案 0 :(得分:1)

这可能对您有用:

import pandas as pd

df1 = pd.DataFrame({'col1': [1, 2, 3, 4, 5]})
df2 = pd.DataFrame({'col1': [1, 2, 9, 4, 7]})

if not df2[df2['col1'] != df1['col1']].empty:
    print(df1[df1['col1'] != df2['col1']])
    print(df2[df2['col1'] != df1['col1']])

Output:
    col1
2     3
4     5
    col1
2     9
4     7

答案 1 :(得分:0)

解决方案

尝试一下。您可以使用以下任一单线解决方案。

# Option-1
df.loc[df.apply(lambda row: row[col1] != row[col2], axis=1), [col1, col2]]
# Option-2
df.loc[df[col1]!=df[col2], [col1, col2]]

逻辑

Option-1 :我们使用pandas.DataFrame.apply()逐行评估目标列,并将返回的索引传递给df.loc[indices, [col1, col2]],这将返回所需的行集col1 != col2

Option-2 :我们使用df[col1] != df[col2]获得索引,其余逻辑与Option-1相同。

虚拟数据

我对伪数据进行了处理,使得对于索引:2、6、8,我们将发现列“ a”和“ c”不同。因此,我们只需要解决方案返回的那些行。

import numpy as np
import pandas as pd

a = np.arange(10)
c = a.copy()
c[[2,6,8]] = [0,20,40]
df = pd.DataFrame({'a': a, 'b': a**2, 'c': c})
print(df)

输出

   a   b   c
0  0   0   0
1  1   1   1
2  2   4   0
3  3   9   3
4  4  16   4
5  5  25   5
6  6  36  20
7  7  49   7
8  8  64  40
9  9  81   9

将解决方案应用于虚拟数据

我们看到建议的解决方案返回了预期的结果。

col1, col2 = 'a', 'c'
result = df.loc[df.apply(lambda row: row[col1] != row[col2], axis=1), [col1, col2]]
print(result)

输出

   a   c
2  2   0
6  6  20
8  8  40

答案 2 :(得分:0)

您需要掌握列值不匹配的索引。一旦有了该索引,便可以查询各个DF以获取值。

请尝试休闲,是否有帮助:

for ind in (df1.loc[df1['col1'] != df2['col1']].index):
    x =  df1.loc[df1.index == ind, 'col1'].values[0]
    y =  df2.loc[df2.index == ind, 'col1'].values[0]
    print(x, y )