gpt4 book ai didi

python - 使用 Pandas 进行 bool 索引对我不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 05:25:49 25 4
gpt4 key购买 nike

使用 bool 索引时,我在 pandas 中遇到了一些奇怪的行为,我不明白哪里出了问题。

DataFrame data 包含 Float 值的列 RSTAR 等,当我尝试做 bool 索引:

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

给我一​​个错误:ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 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 中成功执行的 same 行,它再次给我错误。我在这里完全不知所措。这与缓存有关吗?我打开了一个新终端,但它仍然给我同样的问题。


更新 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 中键入命令来执行命令时,它似乎适用于小型和大型数据帧。但是,当我只是让脚本运行时,它对小型或大型都不起作用。

最佳答案

我认为您可以使用带有 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]

关于python - 使用 Pandas 进行 bool 索引对我不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38765585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com