Например, если вы хотите применить функцию 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)