假设我在下面定义了一个panda 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.取两列之间的差异并计算零的数量。
答案 0 :(得分:1)
使用boolean indexing
和2个面具:
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
使用多列的常规解决方案 - 首先检查all
每行的NaN
是否DataFrame
以及eq
的第一列是否比较True
并且any
每行至少返回一df1 = df[df.notnull().all(axis=1) & df.ne(df.iloc[:, 0], axis=0).any(axis=1)]
print (df1)
a b
2 2.0 0.0
4 0.0 1.0
:
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
另一种解决方案:
CASE WHEN {transaction.status} = 'Pending Receipt' THEN {transaction.expectedreceiptdate} end
答案 1 :(得分:1)
我会像这样使用pandas.DataFrame.apply
:
df.dropna().apply(lambda x: x.a != x.b, axis=1)
只需删除所有NaN值,然后按元素比较两列。
结果是
1 False
2 True
4 True
答案 2 :(得分:1)
这是使用pd.DataFrame.dropna
和pd.DataFrame.query
的一种方式。
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
答案 3 :(得分: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
您显然可以将相同的内容扩展到更多列。