При применении функции к кадру данных, лучше ли каждый столбец в качестве аргумента или всей строки? - PullRequest
2 голосов
/ 25 октября 2019

Например, если вы хотите применить функцию calc_val() к фрейму данных, и у вас есть свобода определять функцию, лучше дать ей сигнатуру типа def calc_val(a, b, c) или def calc_val(row) или def calc_val (ДФ)? Другими словами, опция A, B или C:

Опция A имеет то преимущество, что показывает, какие столбцы обрабатываются функцией, но lambda также беспорядочно и делает читабельностьюхуже, если скрыть важную информацию (то есть вызов функции calc_val_a) дальше по линии, что иногда затрудняет просмотр места использования функции при сканировании кода.

ОпцияB более понятный и лаконичный, но все еще в некотором роде скрывает вызываемую функцию и также не показывает, какие столбцы участвуют в вычислениях.

Опция C очень понятнана то, какая функция применяется путем скрытия apply вдоль строк, в отличие от опций A и B, но это не показывает, что новый столбец был добавлен к кадру данных, или какие столбцы использовались в этом вычислении.

Предполагая, что эти вызовы функций должны присутствовать в функции main() некоторого сценария обработки данных, существует ли стандартная или общепринятая лучшая практика для readabi? Что-то вроде этого?

(Примечание: я также знаю, что apply не идеален для скорости, но я в основном сосредоточен на удобочитаемости при обработке относительно небольших наборов данных. Однако, если у кого-то есть советы по замене apply вызовов для функций, работающих с несколькими столбцами данных, это также будет полезно в этом контексте.)

Опция A:

def calc_val_a(a, b, c):
    if c==1:
        val = a*b
    elif c=='2:
        val = a-b
    return val

df['val'] = df.apply(lambda row: calc_val_a(row.a, row.b, row.c), axis=1)

ОпцияB:

def calc_val_b(row):
    a = row.a
    b = row.b
    c = row.c
    if c==1:
        val = a*b
    elif c=='2:
        val = a-b
    return val

df['val'] = df.apply(calc_val_b, axis=1)

Вариант C:

def calc_val_c(df):
    df['val'] = df.apply(calc_val_b, axis=1)
    return df

df = calc_val(df)
...