2016-08-04 2 views
2

Я получаю странное поведение в пандах при использовании булевой индексации, и я не понимаю, что происходит не так.Булевое индексирование с помощью 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']) 

Работы хорошо. Насколько я могу судить, эти два выражения должны делать то же самое. Так почему нижняя работает, но не самая лучшая?


UPDATE: До сих пор не понимаю, что происходит, я смотрел дальше в него, и вот что получилось:

Я попытался порезать 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']) 

UPDATE 4: Противоположные работает без проблем: data = data[(data.RSTAR != 0) & (data.RSTAR.notnull())].


EDIT: Для того, чтобы понять, что, кажется, тот случай, когда я выполнить команду, введя его непосредственно в PDB, он работает, для малых и больших dataframes.Однако, когда я просто запускаю скрипт, он не работает для малого или большого.

+0

Можете ли вы публиковать необработанные данные и код для воспроизведения, это для меня должно работать, и я не могу воспроизвести его – EdChum

+0

Повесьте, я сейчас пообедал. Я попробовал такой же тип булевых индексирования, но с простым 3x3 DataFrame, и он действительно сработал. Поэтому я не могу воспроизвести и то, что он не работает в приведенном выше примере. В конце дня, хотя, даже если что-то не так с моими данными (я перепроверю это), я не понимаю, почему моя первая часть кода не работает, но вторая делает. –

+0

Я обновил свой вопрос, по-прежнему та же проблема, но теперь есть еще одна несогласованность с тем, как это работает. –

ответ

1

Я думаю, вы можете использовать одно решение линии с функцией панд 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] 
+0

Я думаю, что OP хочет объяснить, почему первый фрагмент кода терпит неудачу, а не столько, как достичь того, чего они хотят, поскольку у них уже есть решение. – EdChum

+0

@Edchum, спасибо. Но похоже, что оба решения одинаковы, как вы думаете? Но я пытаюсь проверить это. – jezrael

+0

Я не могу воспроизвести это, поэтому OP нужно отправить пример – EdChum

Смежные вопросы