我在使用布尔索引时在pandas中遇到一些奇怪的行为,我不明白出了什么问题。
如果DataFrame data
包含RSTAR
个Float
个值列,那么当我尝试进行布尔索引时,我会得到以下内容:
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中输入命令来执行命令时,它适用于小型和大型数据帧。但是,当我让脚本运行时,它不适用于小型或大型。
答案 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]