Ошибка «Переиндексация допустима только для объектов с уникальным значением индекса» при предоставлении списка лямбда-функций методу pivot_table pandas?

#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]))])