Создать новый столбец на основе состояния значений в двух других столбцах фрейма данных - PullRequest
1 голос
/ 20 марта 2019

Я новичок в питоне.У меня есть ощущение, что есть быстрое решение, но мне пока ничего не казалось быстрым.

У меня есть 150 000+ строк данных, data.Внутри него две серии: gridcode и CH4_Flux среди других.Я хочу создать новый категориальный столбец с именем category, который присваивает категориальный идентификатор каждой строке на основе четырех условий, показанных здесь:

cat1 = data[(data.gridcode <= threshAV) & (data.CH4_Flux >= threshAM)]
cat2 = data[(data.gridcode >= threshAV) & (data.CH4_Flux >= threshAM)]
cat3 = data[(data.gridcode <= threshAV) & (data.CH4_Flux <= threshAM)]
cat4 = data[(data.gridcode >= threshAV) & (data.CH4_Flux <= threshAM)]

, где threshAV - это заранее определенный порог для gridcodeи threshAM является заранее определенным порогом для CH4_Flux.По существу, либо оба превышают порог, ни превышают, либо один или другой превышает.Предпочтительно, чтобы категориальные метки были просто целыми числами 1, 2, 3 и 4, соответственно, следуя логике cat1, cat2, cat3 и cat4 выше.

Я пробовал циклы for и операторы if и where, но вычеркнул.

При экспериментировании с петлями for я обычно получаю сообщение об ошибке:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Заранее благодарим вас за любые советы или указания!

1 Ответ

0 голосов
/ 20 марта 2019

Используйте numpy.select для новых столбцов с несколькими логическими масками:

#removed filtering by data[]
m1 = (data.gridcode <= threshAV) & (data.CH4_Flux >= threshAM)
m2 = (data.gridcode >= threshAV) & (data.CH4_Flux >= threshAM)
m3 = (data.gridcode <= threshAV) & (data.CH4_Flux <= threshAM)
m4 = (data.gridcode >= threshAV) & (data.CH4_Flux <= threshAM)

data['category'] = np.select([m1, m2, m3, m4], [1,2,3,4])

Или:

data['category'] = np.select([m1, m2, m3, m4], ['cat1','cat2','cat3','cat4'])
...