Pandas кадр данных применяется к нескольким столбцам - PullRequest
1 голос
/ 24 марта 2020

Я пытаюсь использовать функцию apply для моего DataFrame. Применить использовать пользовательскую функцию, которая возвращает 2 значения и которая должна заполнить строку из 2 столбцов в моем DataFrame.

Ниже приведен простой пример:

df = DataFrame ({'a' : 10})

I sh для создания двух столбцов: b и c. b равно 1, если a больше 0. c равно 1, если a больше 0.

def compute_b_c(a):
   if a > 0:
      return 1, 1
   else:
      return 0,0

Я пробовал это, но возвращает ошибку ключа:

df[['b', 'c']] = df.a.apply(compute_b_c)

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Возможно с конструктором DataFrame, также 1,1 и 0,0 подобны кортежам (1,1) и (0,0):

df = pd.DataFrame ({'a' : [10, -1, 9]})

def compute_b_c(a):
   if a > 0:
      return (1,1)
   else:
      return (0,0)

df[['b', 'c']] = pd.DataFrame(df.a.apply(compute_b_c).tolist())
print (df)
    a  b  c
0  10  1  1
1  -1  0  0
2   9  1  1

Производительность :

#10k rows
df = pd.DataFrame ({'a' : [10, -1, 9] * 10000})

In [79]: %timeit df[['b', 'c']] = pd.DataFrame(df.a.apply(compute_b_c).tolist())
22.6 ms ± 285 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [80]: %timeit df[['b', 'c']] = df.apply(lambda row: compute_b_c(row['a']), result_type='expand', axis=1)
5.25 s ± 84.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
0 голосов
/ 24 марта 2020

Используйте result_type параметр pandas .DataFrame.apply . Применимо, только если вы используете функцию apply для df (DataFrame), а не df.a (Series)

df[['b', 'c']] = df.apply(lambda row: compute_b_c(row['a']), result_type='expand', axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...