忽略NaN的列的比较

时间:2019-05-14 11:52:02

标签: python pandas

我有两列是这样的:

    NaN      35078
  33515      33515
    NaN     123841
    NaN     124074
    NaN       5699
   5700       5703
    NaN       7506
    NaN       9142
   9100       9146
    NaN      10736
  14557      14557
    NaN     17229

我想做的是比较两个列,并使用True或False获得另一个新列。条件是每一行的每一列的值都应该不同,但不能包含NaN值。

我应该得到这样的东西:

False
False
False
False
False
 True
False
False
 True
False
False
False

我有df.loc[:, 'column1'] != df.loc[:, 'column2'],但NaN值不被忽略。谢谢!

2 个答案:

答案 0 :(得分:4)

&绑定另一个布尔掩码,用Series.notna进行按位AND

mask = (df['column1'] != df['column2']) & (df['column1'].notna())
print (mask)
0     False
1     False
2     False
3     False
4     False
5      True
6     False
7     False
8      True
9     False
10    False
11    False
dtype: bool

如果需要同时测试两列:

mask = (df['column1'] != df['column2']) & (df[['column1', 'column1']].notna().all(axis=1))

答案 1 :(得分:0)

如果我理解正确,那么(None < None)False,因此可以直接进行比较:

df = pd.DataFrame({0: {0: None,  1: 33515.0,  2: None,  3: None,  
                       4: None,  5: 5700.0,  6: None,  7: None,  
                       8: 9100.0,  9: None,  10: 14557.0,  11: None}, 
                   1: {0: 35078,  1: 33515,  2: 123841,  3: 124074,  
                       4: 5699,  5: 5703,  6: 7506,  7: 9142,  8: 9146,  
                       9: 10736,  10: 14557,  11: 17229}})

df[0] < df[1]

产量:

0     False
1     False
2     False
3     False
4     False
5      True
6     False
7     False
8      True
9     False
10    False
11    False
dtype: bool