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

Я использовал 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 Ответ

0 голосов
/ 28 марта 2019

Согласно документу pivot_table : когда вы предоставляете список функций для агрегирования, столбцы будут иерархическими, а верхний уровень - это имена функций (выведенные из самих объектов функций).С двумя lambda функциями два имени будут одинаковыми.И вот откуда возникла ваша проблема.

Что ж, я бы был в порядке, используя def, чтобы дать функции имя.Но если вы действительно хотите использовать lambda, возможно, вместо этого используйте groupby и 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]))])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...