Панды применяют функцию на нескольких столбцах - PullRequest
0 голосов
/ 28 марта 2019

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

Как правильно передать аргументы для применения функции к фрейму данных?

def result(row,c):

     if  row[c] >=0 and row[c] <=1:
         return 'c'

     elif row[c] >1 and row[c] <=2:
         return 'b'

     else:
         return 'a'


cols = list(df.columns.values)

for c in cols

     df[c] = df.apply(result, args = (c),  axis=1)

TypeError: ('result() takes exactly 2 arguments (21 given)', u'occurred at index 0')

Формат фрейма входных данных:

d = {'c1': [1, 2, 1, 0], 'c2': [3, 0, 1, 2]}
df = pd.DataFrame(data=d)
df
      c1   c2
0     1     3
1     2     0
2     1     1
3     0     2

1 Ответ

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

Вам не нужно передавать имя столбца для применения. Поскольку вы только хотите проверить, находятся ли значения столбцов в определенном диапазоне и должны возвращать a, b or c. Вы можете внести следующие изменения.

def result(val):

     if  0<=val<=1:
         return 'c'
     elif 1<val<=2:
         return 'b'
     return 'a'


cols = list(df.columns.values)

for c in cols

     df[c] = df[c].apply(result)

Обратите внимание, что это заменит значения вашего столбца.

Более быстрый способ - np.select :

import numpy as np
values = ['c', 'b']
for col in df.columns:
    df[col] = np.select([0<=df[col]<=1, 1<df[col]<=2], values, default = 'a')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...