Фрейм данных Python назначает новый столбец, используя лямбда-функцию с 2 переменными и оператор if else - PullRequest
0 голосов
/ 26 октября 2018

Настройка кадра данных:

import pandas as pd
import numpy as np

np.random.seed(99)

rows = 10

df = pd.DataFrame ({'A' : np.random.choice(range(0, 2), rows, replace = True),
                    'B' : np.random.choice(range(0, 2), rows, replace = True)})

df


   A  B
0  1  1
1  1  1
2  1  0
3  0  1
4  1  1
5  0  1
6  0  1
7  0  0
8  1  1
9  0  1

Если вы хотите добавить столбец 'C' со значением 'X', то это df.A и df.B, оба равны 0, а еще значение 'Y'.

Я пытался:

df.assign(C = lambda row: 'X' if row.A + row.B == 0 else 'Y')

но это не работает ...

Я нашел другие способы получить свои результаты, но хотел бы использовать .assign с лямбда-функцией в этой ситуации.

Любые предложения о том, как получить назначение с лямбда работает?

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Нет, не используйте lambda

Вы можете сделать это векторизовано:

import numpy as np

df['C'] = np.where(df['A'] + df['B'] == 0, 'X', 'Y')

Решение lambda не имеет здесь никакой выгоды, но если вы этого хотите ....

df = df.assign(C=np.where(df.pipe(lambda x: x['A'] + x['B'] == 0), 'X', 'Y'))

Способ использования bad assign + lambda:

df = df.assign(C=df.apply(lambda x: 'X' if x.A + x.B == 0 else 'Y', axis=1))

Что не так с способом bad если вы перебираете строки в цикле уровня Python.Это часто хуже , чем обычный цикл Python for.

Первые два решения выполняют векторизованные операции над смежными блоками памяти и в результате обрабатываются более эффективно.

0 голосов
/ 26 октября 2018

Создайте более простое условие и примените его к строкам:

df['C'] = df.apply(lambda row: 'X' if (row.A or row.B) else 'Y', axis = 1)
0 голосов
/ 26 октября 2018

Почти там ...

df['C'] = df.apply(lambda row: 'X' if row.A + row.B == 0 else 'Y', axis = 1)
...