比较pandas / numpy中的NaN列

时间:2016-02-15 21:51:47

标签: python numpy pandas

我想比较数据框中可能包含NaN值的两列。

基于link我试图调整我的代码,但我正在努力解决以下问题:

(s1[s1.notnull()] == s2[s2.notnull()]).all()

如何调整此代码,以便我不需要从数据框中提取s1和s2作为系列,但可以直接应用它:

import pandas as pd
import numpy as np

mydata = [{'SystemA': 1.78, 'SystemB':1.78},
          {'SystemA': 2.5, 'SystemB':2.5},
          {'SystemA': np.nan, 'SystemB':np.nan}]

df = pd.DataFrame(mydata)
print(df)

# does not return single True or False
# gives wrong result when e.g. 2.5 is changed to 2.6 in just one column
c =  (df['SystemA'].notnull() == df['SystemB'].notnull()).all()

print('\nc:',c)

3 个答案:

答案 0 :(得分:3)

equals方法忽略了nans:

>>> df
   SystemA  SystemB
0     1.78     1.78
1     2.50     2.50
2      NaN      NaN
>>> (df["SystemA"] == df["SystemB"]).all()
False
>>> df["SystemA"].equals(df["SystemB"])
True
>>> df.iloc[1,1] = 2.6
>>> df
   SystemA  SystemB
0     1.78     1.78
1     2.50     2.60
2      NaN      NaN
>>> df["SystemA"].equals(df["SystemB"])
False

虽然它也检查dtype相等,所以如果你有一系列整数和一系列浮点数,它会说它们不相等即使你有

>>> ((df.SystemA == df.SystemB) | (df.SystemA.isnull() & df.SystemB.isnull())).all()
True

这对您来说可能是也可能不是问题。

答案 1 :(得分:1)

是你在找什么:

df['SystemA'].dropna() == df['SystemB'].dropna()

答案 2 :(得分:0)

mydata = [{'SystemA': 1.78, 'SystemB':1.78},
          {'SystemA': 2.5, 'SystemB':2.5},
          {'SystemA': np.nan, 'SystemB':np.nan}]

df = pd.DataFrame(mydata)

这将获得两个cols为null的行:

df[pd.isnull(df['SystemA']) & (pd.isnull(df['SystemB']))]

    SystemA     SystemB
 2  NaN     NaN

这将获得两个cols都不是空的行:

df[(df['SystemA'].notnull()) & (df['SystemB'].notnull())]

SystemA     SystemB
0   1.78    1.78
1   2.50    2.50

我假设你的其中一个是什么?