Предположим, у меня есть датафрейм с 3 столбцами. Я хочу сгруппировать его по одному из столбцов и вычислить новое значение для каждой группы, используя пользовательскую функцию агрегирования.
Это новое значение имеет совершенно другое значение, и его столбец просто отсутствует в исходном кадре данных. Итак, по сути, я хочу изменить форму информационного кадра во время преобразования groupby() + agg()
. Исходный фрейм данных выглядит как (foo, bar, baz)
и имеет индекс диапазона, в то время как результирующий фрейм данных должен иметь только столбец (qux)
и baz
в качестве индекса.
import pandas as pd
df = pd.DataFrame({'foo': [1, 2, 3], 'bar': ['a', 'b', 'c'], 'baz': [0, 0, 1]})
df.head()
# foo bar baz
# 0 1 a 0
# 1 2 b 0
# 2 3 c 1
def calc_qux(gdf, **kw):
qux = ','.join(map(str, gdf['foo'])) + ''.join(gdf['bar'])
return (None, None) # but I want (None, None, qux)
df = df.groupby('baz').agg(calc_qux, axis=1) # ['qux'] but then it fails, since 'qux' is not presented in the frame.
df.head()
# qux
# baz
# 0 1,2ab
# 1 3c
Приведенный выше код выдает ошибку ValueError: Shape of passed values is (2, 3), indices imply (2, 2)
, если я пытаюсь вернуть из функции агрегирования другое количество значений, чем количество столбцов в исходном кадре данных.