Назначение пользовательского имени для кастомной функции внутри pivot_table
Собираю данные в сводной таблице, нужно вывести процентили. Стандартная функция из нумпая не работает внутри, поэтому создаю лямбда функцию вот в таком виде:
service_usage = costs.pivot_table(index=['disconnected_status'], values=['MonthlyCharges', 'TotalCharges'],
aggfunc={'MonthlyCharges':
[np.mean, np.var, np.std, lambda x: np.percentile(x, 25), lambda x: np.percentile(x, 75)],
'TotalCharges':
[np.mean,np.var, np.std, lambda x: np.percentile(x, 50), lambda x: np.percentile(x, 75)]})
На выходе получаются вот такие заголовки:
MonthlyCharges TotalCharges
<lambda_0> <lambda_1> mean std var <lambda_0> <lambda_1> mean std var
Подскажите, пожалуйста, как назначать имена для своих функций, чтоб на выходе не иметь <lambda_0>, а получить, например, "25%".
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
За отображаемое имя отвечает поле __name__ объекта:
import numpy as np
print(np.mean.__name__) # Вывод: mean
print((lambda: 1).__name__) # Вывод: <lambda>
Можно вынести лямбды в отдельные функции, перезаписать поле __name__, потом передать функции в pivot_table:
def percentile25(x):
return np.percentile(x, 25)
percentile25.__name__ = "25%"
def percentile50(x):
return np.percentile(x, 50)
percentile50.__name__ = "50%"
def percentile75(x):
return np.percentile(x, 75)
percentile75.__name__ = "75%"
service_usage = costs.pivot_table(index=['disconnected_status'], values=['MonthlyCharges', 'TotalCharges'],
aggfunc={'MonthlyCharges':
[np.mean, np.var, np.std, percentile25, percentile75],
'TotalCharges':
[np.mean, np.var, np.std, percentile50, percentile75]})
Если вынос в отдельные функции вас не подходит, сделайте функцию, которая будет перезаписывать это поле у лямбды (так даже удобнее, я думаю):
def set_name(callable, name):
callable.__name__ = name
return callable
service_usage = costs.pivot_table(index=['disconnected_status'], values=['MonthlyCharges', 'TotalCharges'],
aggfunc={'MonthlyCharges':
[np.mean, np.var, np.std,
set_name(lambda x: np.percentile(x, 25), "25%"),
set_name(lambda x: np.percentile(x, 75), "75%")],
'TotalCharges':
[np.mean, np.var, np.std,
set_name(lambda x: np.percentile(x, 50), "50%"),
set_name(lambda x: np.percentile(x, 75), "75%")]})