如何按列分组并在Python中通过自己的函数进行汇总

时间:2017-03-03 13:52:31

标签: python r pandas group-by

让我们来自Pandas的测试数据框架:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three','two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8),
                   'D' : np.random.randn(8)})

我现在想要做的事实上就是按照A栏来分组,例如:

df.groupby(['A'])['C'].sum()

工作正常。现在我没有使用sum()而是想要应用自己的函数来有效地汇总数据。

R中的等价物是:

require(plyr); require(dplyr)

df = data.frame(A = c('foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'),
                B = c('one', 'one', 'two', 'three','two', 'two', 'one', 'three'),
                C = rnorm(8),
                D = rnorm(8))

例如,此函数名为myfun

myfun <- function(x){sum(x**2)}

然后:

df %>% 
   group_by(A) %>% 
   summarise(result = myfun(C))

我希望这个问题很清楚。非常感谢!

1 个答案:

答案 0 :(得分:3)

您可以使用agg并将自定义函数放在lambda中,例如

>>> df.groupby('A').C.agg(lambda x: x.pow(2).sum())
A
bar    3.787664
foo    2.448404
Name: C, dtype: float64

或者您可以单独定义它并将其传递给agg

def sum2(x):
    return x.pow(2).sum()


>>> df.groupby('A').C.agg(sum2)
A
bar    3.787664
foo    2.448404
Name: C, dtype: float64

另请注意,agg接受函数参数的许多内容,因此它非常灵活。 From the docs,用于聚合群组的arg函数目前可以是:

  • string cythonized function name
  • 功能
  • 功能列表
  • 列的词典 - &gt;功能
  • 嵌套的名字词典 - &gt;职能部门