我正在尝试比较熊猫中的两列。我知道我可以做到:
# 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循环,但均未解决问题。 谁能指出我应该如何去做我描述的事情?
答案 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 )