使用Pandas的布尔索引对我不起作用

时间:2016-08-04 11:03:41

标签: python pandas numpy scipy

我在使用布尔索引时在pandas中遇到一些奇怪的行为,我不明白出了什么问题。

如果DataFrame data包含RSTARFloat个值列,那么当我尝试进行布尔索引时,我会得到以下内容:

rejection_list = list( data[ (data.RSTAR == 0) | (~ np.isfinite(data.RSTAR)) ].loc[:,'NAME'] )

给我一​​个错误:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

以下是另一方面:

booll = (data.RSTAR == 0) | (~ np.isfinite(data.RSTAR))
rejection_list2 = list(data[booll].loc[:,'NAME'])

工作正常。据我所知,这两个表达式应该完全相同。那么为什么底部的工作有效,而不是最高的工作呢?

更新:仍然不明白发生了什么,我进一步研究了这里发生了什么:

我尝试对data DataFrame进行切片,以便我可以在此处发布。因此,使用data = data.loc[:5,:],我会得到同样的错误。但是,使用data = data.loc[:5, ['RSTAR', 'NAME']]我没有错误,它可以正常工作。

我不确定如何在这里发布整个data数组,因为它有很多列,但列名是:

data.columns
Index(['Unnamed: 0', 'NAME', 'RADIUS', 'RUPPER', 'RLOWER', 'UR', 'MASS',
       'MASSUPPER', 'MASSLOWER', 'UMASS', 'A', 'AUPPER', 'ALOWER', 'UA',
       'RSTAR', 'RSTARUPPER', 'RSTARLOWER', 'URSTAR', 'TEFF', 'TEFFUPPER',
       'TEFFLOWER', 'UTEFF', 'ECC', 'LUM', 'RERRMAX', 'LOG_FLUX', 'FLUX'],
      dtype='object')

所以我看不到任何重复或任何东西。我只是不明白什么是错的。

更新2:它更令人困惑。所以我再次进入pdb,如下:

pdb.set_trace() ###
rejection_list = list(data[ (data.RSTAR == 0) | (~ np.isfinite(data.RSTAR)) ].loc[:,'NAME'])

并保持相同的data,我复制并粘贴上面的确切陈述:rejection_list = list(data[ (data.RSTAR == 0) | (~ np.isfinite(data.RSTAR)) ].loc[:,'NAME'])并且在pdb模式下 。但是,只要我点击c继续从pdb进入下一行,我刚刚在pdb中成功执行的相同行,它再次给我错误。我在这里完全失败了。它与缓存有关吗?我开了一个新的终端,但它仍然给我同样的问题。

更新3:尝试使用isnull()和notnull()以及同样的问题。

booll = (data.RSTAR==0) | (data.RSTAR.isnull())
data[booll]

有效,但以下情况并非如此:

rejection_list = list(data[ (data.RSTAR == 0) | (data.RSTAR.isnull()) ].loc[:,'NAME'])

更新4:相反的工作没有问题:data = data[(data.RSTAR != 0) & (data.RSTAR.notnull())]

编辑:为了说清楚,似乎是这样的情况,当我通过直接在pdb中输入命令来执行命令时,它适用于小型和大型数据帧。但是,当我让脚本运行时,它不适用于小型或大型。

1 个答案:

答案 0 :(得分:1)

我认为您可以使用pandas函数notnull的单行解决方案:

rejection_list = data.ix[(data.RSTAR == 0) | (data.RSTAR.notnull()) , 'NAME'].tolist()

或:

rejection_list = data.loc[(data.RSTAR == 0) | (data.RSTAR.notnull()) , 'NAME'].tolist()

我尝试重现您的错误,但一切正常:

import pandas as pd
import numpy as np

data = pd.DataFrame({'RSTAR':[0,2,-np.inf, np.nan,np.inf],
                     'NAME':[4,5,6,7,10]})

print (data)
   NAME     RSTAR
0     4  0.000000
1     5  2.000000
2     6      -inf
3     7       NaN
4    10       inf

rejection_list = list( data[ (data.RSTAR == 0) | (~ np.isfinite(data.RSTAR)) ].loc[:,'NAME'])
print (rejection_list)
[4, 6, 7, 10]

booll = (data.RSTAR == 0) | (~ np.isfinite(data.RSTAR))
rejection_list2 = list(data[booll].loc[:,'NAME'])
print (rejection_list2)
[4, 6, 7, 10]

rejection_list3 = data.ix[(data.RSTAR == 0) | (data.RSTAR.notnull()) , 'NAME'].tolist()
print (rejection_list2)
[4, 6, 7, 10]