Я получаю странное поведение в пандах при использовании булевой индексации, и я не понимаю, что происходит не так.Булевое индексирование с помощью 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.Однако, когда я просто запускаю скрипт, он не работает для малого или большого.
Можете ли вы публиковать необработанные данные и код для воспроизведения, это для меня должно работать, и я не могу воспроизвести его – EdChum
Повесьте, я сейчас пообедал. Я попробовал такой же тип булевых индексирования, но с простым 3x3 DataFrame, и он действительно сработал. Поэтому я не могу воспроизвести и то, что он не работает в приведенном выше примере. В конце дня, хотя, даже если что-то не так с моими данными (я перепроверю это), я не понимаю, почему моя первая часть кода не работает, но вторая делает. –
Я обновил свой вопрос, по-прежнему та же проблема, но теперь есть еще одна несогласованность с тем, как это работает. –