#python #pandas #lambda
#python #pandas #лямбда
Вопрос:
Я использую pandas.pivot_table для агрегирования по моим фреймам данных, предоставляя параметру aggfunc список функций ( [np.mean, np.std]
например). Теперь я хочу обернуть эти функции так, чтобы они работали только с первой половиной предоставленного столбца, делая что-то вроде:
new_df = pd.pivot_table(df, values=feature_cols, index=id_cols, aggfunc=[lambda x: np.mean(x[:len(x)//2]), lambda y: np.std(y[:len(y)//2])])
Который выдает ошибку:
pandas.core.indexes.base.InvalidIndexError: Reindexing only valid with uniquely valued Index objects
Тем не менее, new_df = pd.pivot_table(df, values=feature_cols, index=id_cols, aggfunc=[np.mean,np.std])
работает просто отлично.
Я полагаю, что могу неправильно понимать, как pivot_table
передается массивоподобный агрегатным функциям или как работают лямбды в целом.
Хотелось бы либо исправить это, либо узнать о лучшем способе переноса функций в python. Я не хочу использовать def
определенную функцию для каждой функции в списке, которую мне нужно использовать.
Ответ №1:
Согласно документу pivot_table: Когда вы предоставляете список функций для агрегирования, столбцы будут иерархическими, а верхний уровень — это имена функций (выведенные из самих объектов функций). С двумя lambda
функциями два имени будут одинаковыми. И вот откуда ваша проблема.
Ну, я был бы в порядке, используя def
, чтобы присвоить функции имя. Но если вы действительно хотите использовать lambda
, возможно, вместо этого используйте groupby
and agg
:
new_df = df.groupby(id_col).agg([('half-mean',lambda x:np.mean(x[:len(x)//2])),('half-std',lambda x:np.std(x[:len(x)//2]))])