Python эквивалентный iflse dplyr - PullRequest
1 голос
/ 18 июня 2019

Я конвертирую код из R в Python и ищу некоторую помощь в замене нового столбца на основе других столбцов, используя dfply синтаксис / трубопровод

В этом примере я хочу вычесть 2 из col1, если col2 равно 'c', в противном случае добавьте 4

import pandas as pd
import numpy as np
from dfply import *

col1 = [1,2,3,4,5]
col2 = ['a', 'b', 'c', 'd', 'e']

df = pd.DataFrame(data = {'col1': col1, 'col2': col2})

в R я бы сделал:

df_new <- df %>% 
  mutate(newCol = ifelse(col2 == 'c', col1 - 2, col1 + 4))

но Python вроде бы не такой:

new_df = (df >>
    mutate(newCol = np.where(X.col2 == 'c', X.col1 - 2, X.col1 + 4)))

Я получаю сообщение об ошибке "invalid __array_struct __"

Обратите внимание, что это прекрасно работает:

new_df = (df >>
    mutate(newCol = X.col1 - 2))

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Я буду использовать функцию apply / lambda. X - строка данных, а ось = 1 означает применение лямбда-функции к столбцу.

df['newCol'] = df.apply(lambda X: X.col1 - 2 if X.col2 == 'c' else X.col1 + 4, axis=1)
df

  col1 col2 newCol
0   1   a   5
1   2   b   6
2   3   c   1
3   4   d   8
4   5   e   9
0 голосов
/ 18 июня 2019

Эквивалент Python здесь будет встроенным if else выражением (или троичным оператором ):

ifelse(col2 == 'c', col1 - 2, col1 + 4)

Тогда станет

col1 - 2 if col2 == 'c' else col1 + 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...