获取.eq以忽略NAN值

时间:2015-08-29 21:10:38

标签: python python-3.x pandas ipython

我有一个类似于

的数据框(df)
PID     SID     RID     
124     294     294
954     299     299
NAN     949     493
959     NAN     959
059     059     059 
0405    NAN     NAN
493     942     395

我用过

testdf = df.eq(df["PID"], axis='index').all(axis=1) 

获取一个列表(testdf),报告角色中的值是否相等,这是有效的,但NAN会妨碍。

我尝试使用

testdf = df.eq(df["PID"], axis='index').all(axis=1).notnull()

但出于某种原因,当我知道某些行没有时,它会报告所有内容相等。

以下是我希望testdf在最后看起来像什么的示例

0    False
1    False
2    False
3    True
4    True
5    False
6    False

2 个答案:

答案 0 :(得分:1)

如果可以忽略NaN,我们可以在每列中填充NaNRIDSID)。如果剩余值等于PID,则结果为True,否则为False。 您可以在DataFrame的副本上执行此操作,以便不会更改原始数据。

df['SID'] = df['SID'].fillna(df['RID'])
df['RID'] = df['RID'].fillna(df['SID'])
testdf = df.eq(df['PID'], axis='index').all(axis=1)
testdf

结果如下:

0    False
1    False
2    False
3     True
4     True
5    False
6    False

答案 1 :(得分:0)

此问题是由np.nan == np.nanFalsenp.nan != np.nanTrue的事实引起的。一个快速的解决方法是替换nandf中的任何df2,而不是您的数据框中的内容,例如foo

df = df.fillna("foo")
df2 = df2.fillna("foo")

然后,您可以根据需要比较数据框。