pandas groupby () с пользовательской статистической функцией и помещает результат в новый столбец - PullRequest
0 голосов
/ 08 ноября 2018

Предположим, у меня есть датафрейм с 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), если я пытаюсь вернуть из функции агрегирования другое количество значений, чем количество столбцов в исходном кадре данных.

1 Ответ

0 голосов
/ 08 ноября 2018

Вы хотите использовать apply() здесь, так как вы не работаете с одним столбцом (в этом случае agg() будет уместно):

import pandas as pd

df = pd.DataFrame({'foo': [1, 2, 3], 'bar': ['a', 'b', 'c'], 'baz': [0, 0, 1]})

def calc_qux(x):

    return ','.join(x['foo'].astype(str).values) + ''.join(x['bar'].values)

df.groupby('baz').apply(calc_qux).to_frame('qux')

Урожайность:

       qux
baz       
0    1,2ab
1       3c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...