Python 如何计算pandas中两列DataFrame之间定义的值差异数?

Python 如何计算pandas中两列DataFrame之间定义的值差异数?,python,pandas,dataframe,difference,Python,Pandas,Dataframe,Difference,假设我在下面定义了一个pandasDataFrame: a b 0 N/A 3 1 1 1 2 2 0 3 2 N/A 4 0 1 5 N/A N/A 我想计算一下在a和b两列中定义了值的行中有多少行的值不相等。在本例中,有两个这样的行,索引为2和4。索引0、3和5在至少一列中包含未定义的值,且索引为1的行的值相等 我考虑的方法是删除a或b中包含未定义值的所有行,然后使用f.e.计算两列之间的差值并计算零的数量。使用两

假设我在下面定义了一个pandas
DataFrame

    a     b
0  N/A    3
1   1     1
2   2     0
3   2    N/A
4   0     1
5  N/A   N/A
我想计算一下在
a
b
两列中定义了值的行中有多少行的值不相等。在本例中,有两个这样的行,索引为2和4。索引0、3和5在至少一列中包含未定义的值,且索引为1的行的值相等

我考虑的方法是删除
a
b
中包含未定义值的所有行,然后使用f.e.计算两列之间的差值并计算零的数量。

使用两个掩码:

df1 = df[(df['a'].isnull() == df['b'].isnull()) & (df['a'] != df['b'])]
print (df1)
     a    b
2  2.0  0.0
4  0.0  1.0
详情:

print ((df['a'].isnull() == df['b'].isnull()))
0    False
1     True
2     True
3    False
4     True
dtype: bool

print ((df['a'] != df['b']))
0     True
1    False
2     True
3     True
4     True
dtype: bool

print ((df['a'].isnull() == df['b'].isnull()) & (df['a'] != df['b']))
0    False
1    False
2     True
3    False
4     True
dtype: bool
使用多列的一般解决方案-首先检查是否所有True都不是每行的NaN,并通过第一列的chain比较数据帧,并通过以下方式每行返回至少一个True:

详细信息

print (df.notnull())
       a      b
0  False   True
1   True   True
2   True   True
3   True  False
4   True   True

print (df.notnull().all(axis=1))
0    False
1     True
2     True
3    False
4     True
dtype: bool

print (df.ne(df.iloc[:, 0], axis=0))
       a      b
0   True   True
1  False  False
2  False   True
3  False   True
4  False   True

print (df.ne(df.iloc[:, 0], axis=0).any(axis=1))
0     True
1    False
2     True
3     True
4     True
dtype: bool
另一个解决方案:

df = df[(df['a'].notnull()) & (df['b'].notnull()) & (df['a'] != df['b'])]
print (df)
     a    b
2  2.0  0.0
4  0.0  1.0

通过逻辑比较,您有一种内置的方法来实现这一点,而且不会浪费资源来求和列

假设:

>> import numpy as np
>> import pandas as pd     
>> d = { 'a': [np.NaN, 1 , 2 , 2 , 0], 'b': [3, 1, 0 , np.NaN, 1]}
>> df = pd.DataFrame(d)
最简单的方法可能是:

>> df.dropna().a != df.dropna().b

    1    False
    2     True
    4     True
    dtype: bool
显然,您可以将同样的内容扩展到更多的列。

我将使用以下内容:

df.dropna().apply(lambda x: x.a != x.b, axis=1)
只需删除所有NaN值,然后按元素比较两列

结果是

1    False
2    True
4    True
这是使用和的一种方法


我能再解释一下吗?是否要在所有列和返回行中检查值
0
?还是别的什么?谢谢。我忘了提到我不希望两列都是N/A.df[(df['A'].isnull()==False)&(df['b'].isnull()==False)&(df['A']!=df['b'])?或
df[(df['A'].notnull())和(df['b'].notnull())&(df['A']!=df['b'])
更干净。。。
1    False
2    True
4    True
count = len(df.dropna().query('a != b'))  # 2

res = df.dropna().query('a != b')

print(res)

     a    b
2  2.0  0.0
4  0.0  1.0