Назначение пользовательского имени для кастомной функции внутри 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%")]})
→ Ссылка