Python 如何计算pandas中两列DataFrame之间定义的值差异数?
假设我在下面定义了一个pandasPython 如何计算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.计算两列之间的差值并计算零的数量。使用两
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