Мутировать столбец условно - PullRequest
0 голосов
/ 25 мая 2018

Я программист на R, пытаюсь войти в Python.В R, когда я хочу условно изменить столбец, я использую:

col = dplyr::mutate(col, ifelse(condition, if_true(x), if_false(x))

В Python, как условно изменить значение столбца?Вот мой минимально воспроизводимый пример:

def act(cntnt):
    def do_thing(cntnt):
        return(cntnt + "has it")
    def do_other_thing(cntnt):
        return(cntnt + "nope")
    has_abc = cntnt.str.contains.contains("abc")
    if has_abc == T:
        cntnt[has_abc].apply(do_thing)
    else:
        cntnt[has_abc].apply(do_other_thing)

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я думаю, что вы ищете assign, что по сути эквивалентно пандам mutate в dplyr.Ваше условное утверждение может быть написано с использованием списка или с использованием векторизованных методов (см. Ниже).

Возьмем пример фрейма данных, назовем его df:

> df
             a
1   0.50212013
2   1.01959213
3  -1.32490344
4  -0.82133375
5   0.23010548
6  -0.64410737
7  -0.46565442
8  -0.08943858
9   0.11489957
10 -0.21628132

R / dplyr:

В R вы можете использовать mutate с ifelse для создания столбца на основе условия (в этом примере это будет 'pos', когда столбец a больше 0):

df = dplyr::mutate(df, col = ifelse(df$a > 0, 'pos', 'neg'))

И получающийся df:

> df
             a col
1   0.50212013 pos
2   1.01959213 pos
3  -1.32490344 neg
4  -0.82133375 neg
5   0.23010548 pos
6  -0.64410737 neg
7  -0.46565442 neg
8  -0.08943858 neg
9   0.11489957 pos
10 -0.21628132 neg

Python / Pandas

В pandas, используйте assign с пониманием списка:

df = df.assign(col = ['pos' if a > 0 else 'neg' for a in df['a']])

Полученный df:

>>> df
          a  col
0  0.502120  pos
1  1.019592  pos
2 -1.324903  neg
3 -0.821334  neg
4  0.230105  pos
5 -0.644107  neg
6 -0.465654  neg
7 -0.089439  neg
8  0.114900  pos
9 -0.216281  neg

ifelse, который вы использовали в R, заменяется списком .

Варианты этого:

У вас нет для использования assign: вы можете создать новый столбец непосредственно на df без создания копии, еслиВы хотите:

df['col'] = ['pos' if a > 0 else 'neg' for a in df['a']]

Кроме того, вместо понимания списка вы можете использовать один из векторизованных методов numpy для условных операторов, например, np.select:

import numpy as np
df['col'] = np.select([df['a'] > 0], ['pos'], 'neg')
# or
df = df.assign(col = np.select([df['a'] > 0], ['pos'], 'neg'))
0 голосов
/ 25 мая 2018

Вы можете использовать условие (и его отрицание) для логической индексации:

has_abc = cntnt.str.contains("abc")
cntnt[ has_abc].apply(do_thing)
cntnt[~has_abc].apply(do_other_thing)
...