Определение функции для использования в DataFrame с помощью .apply () - PullRequest
0 голосов
/ 29 декабря 2018

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

Я пытался воспроизвести решение, упомянутое в статье «Как использовать функцию« Применение »Pandas для нескольких столбцов?», Но мне не удается понять, как нужно настроить функцию для приема данных от другихстолбцы в качестве входных данных.

Пример моего кода:

import pandas as pd

df=pd.DataFrame({'NAME':['A','B','C','D'],'HOURS':[38, 52, 1040, 28],'ROLE':['Manager','Expert','Expert','Expert']})

def apply_rate(col1='HOURS', col2='ROLE'):
    if row[col2]=='Manager': return row[col1]*165
    else: return row[col1]*135

df['TOTAL']=df.apply(lambda row: apply_rate(row['HOURS'],row['ROLE']),axis=1)

Я получаю сообщение "KeyError: ('Manager', 'произошло с индексом 0')", но я застрял на этом этапе,и я не знаю, как выбраться из этой точки блокировки.

1 Ответ

0 голосов
/ 29 декабря 2018

Хитрость заключается в том, чтобы полностью удалить lambda.Передайте функцию на pd.DataFrame.apply и, возможно, передайте дополнительные параметры функции на apply напрямую:

def apply_rate(row, col1, col2):
    if row[col2]=='Manager': return row[col1]*165
    else: return row[col1]*135

df['TOTAL'] = df.apply(apply_rate, axis=1, col1='HOURS', col2='ROLE')

print(df)

  NAME  HOURS     ROLE   TOTAL
0    A     38  Manager    6270
1    B     52   Expert    7020
2    C   1040   Expert  140400
3    D     28   Expert    3780

Тем не менее, строчные операциинеэффективно и не рекомендуемое использование панд.Вы можете легко векторизовать свой алгоритм с помощью операций по столбцам:

df['TOTAL'] = df['HOURS'] * np.where(df['ROLE'] == 'Manager', 165, 135)

Альтернативная, более легко расширяемая версия может использовать отображение словаря:

factor_map = {'Manager': 165}
df['TOTAL'] = df['HOURS'] * df['ROLE'].map(factor_map).fillna(135)
...