Применение нескольких функций к нескольким столбцам группы

В документах показано, как применять одновременно несколько объектов по объекту groupby с помощью dict с именами столбцов вывода в качестве ключей:

In [563]: grouped['D'].agg({'result1' : np.sum, .....: 'result2' : np.mean}) .....: Out[563]: result2 result1 A bar -0.579846 -1.739537 foo -0.280588 -1.402938 

Однако это работает только на объекте Series groupby. И когда dict аналогично передается группе DataFrame, он ожидает, что ключи будут именами столбцов, к которым будет применена функция.

Я хочу сделать несколько функций для нескольких столбцов (но некоторые столбцы будут работать несколько раз). Кроме того, некоторые функции будут зависеть от других столбцов в объекте groupby (например, функции sumif). Мое текущее решение состоит в том, чтобы перейти от столбца к столбцу и сделать что-то вроде кода выше, используя lambdas для функций, которые зависят от других строк. Но это занимает много времени (я думаю, что для прохождения через объект groupby требуется много времени). Мне придется изменить его так, чтобы я перебирал весь объект groupby за один проход, но мне интересно, есть ли в пандах встроенный способ сделать это несколько чисто.

Например, я пробовал что-то вроде

 grouped.agg({'C_sum' : lambda x: x['C'].sum(), 'C_std': lambda x: x['C'].std(), 'D_sum' : lambda x: x['D'].sum()}, 'D_sumifC3': lambda x: x['D'][x['C'] == 3].sum(), ...) 

но, как и ожидалось, я получаю KeyError (поскольку ключи должны быть столбцом, если agg вызывается из DataFrame).

Есть ли встроенный способ сделать то, что я хотел бы сделать, или возможность добавления этой функциональности, или мне просто нужно выполнить итерацию через группу вручную?

благодаря

  • QT4, GTK +, wxWidgets или IronPython для собственного приложения Windows с использованием Python
  • Первый набор данных (разброса) графика остается на графике во время анимации с помощью matplotlib Python
  • Как сообщить Python, что sys.argv находится в Unicode?
  • MSSQL в python 2.7
  • заменить строки в кадре данных pandas
  • Интересный «getElementById () принимает ровно 1 аргумент (2 данный)», иногда это происходит. Может кто-нибудь объяснить это?
  • Неблокирующий subprocess.call
  • Отметьте данные как чувствительные в python
  • One Solution collect form web for “Применение нескольких функций к нескольким столбцам группы”

    Для первой части вы можете передать имя столбца для ключей и список функций для значений:

     In [28]: df Out[28]: ABCDE GRP 0 0.395670 0.219560 0.600644 0.613445 0.242893 0 1 0.323911 0.464584 0.107215 0.204072 0.927325 0 2 0.321358 0.076037 0.166946 0.439661 0.914612 1 3 0.133466 0.447946 0.014815 0.130781 0.268290 1 In [26]: f = {'A':['sum','mean'], 'B':['prod']} In [27]: df.groupby('GRP').agg(f) Out[27]: AB sum mean prod GRP 0 0.719580 0.359790 0.102004 1 0.454824 0.227412 0.034060 

    ОБНОВЛЕНИЕ 1:

    Поскольку функция aggregate работает в Series, ссылки на другие имена столбцов теряются. Чтобы обойти это, вы можете ссылаться на полный блок данных и индексировать его, используя индексы группы в функции лямбда.

    Вот хакерский способ обхода:

     In [67]: f = {'A':['sum','mean'], 'B':['prod'], 'D': lambda g: df.ix[g.index].E.sum()} In [69]: df.groupby('GRP').agg(f) Out[69]: ABD sum mean prod <lambda> GRP 0 0.719580 0.359790 0.102004 1.170219 1 0.454824 0.227412 0.034060 1.182901 

    Здесь результирующий столбец «D» состоит из суммированных значений «E».

    ОБНОВЛЕНИЕ 2:

    Вот метод, который, я думаю, сделает все, что вы просите. Сначала создайте пользовательскую лямбда-функцию. Ниже, g ссылается на группу. При агрегировании g будет Серией. Передача g.index в df.ix[] выбирает текущую группу из df. Затем я тестирую, если столбец C меньше 0,5. Возвращенная логическая серия передается в g[] которая выбирает только те строки, которые соответствуют критериям.

     In [95]: cust = lambda g: g[df.ix[g.index]['C'] < 0.5].sum() In [96]: f = {'A':['sum','mean'], 'B':['prod'], 'D': {'my name': cust}} In [97]: df.groupby('GRP').agg(f) Out[97]: ABD sum mean prod my name GRP 0 0.719580 0.359790 0.102004 0.204072 1 0.454824 0.227412 0.034060 0.570441 
    Python - лучший язык программирования в мире.