Pandas:使用多个函数聚合多个列

时间:2016-03-11 10:55:11

标签: python r pandas dplyr

Python中的Pandas和R中的Dplyr都是灵活的数据争用工具。例如,在R中,使用dplyr可以执行以下操作:

custom_func <- function(col1, col2) length(col1) + length(col2)

ChickWeight %>% 
  group_by(Diet) %>% 
  summarise(m_weight = mean(weight), 
            var_time = var(Time), 
            covar = cov(weight, Time),
            odd_stat = custom_func(weight, Time))

在一个声明中注意如何;

  • 我可以在一行中汇总多个列。
  • 我可以在一行中对这些多列应用不同的函数。
  • 我可以使用考虑两列的功能。
  • 我可以为其中任何一个投入自定义函数。
  • 我可以为这些聚合声明新的列名。

大熊猫也有可能出现这种模式吗?请注意,我有兴趣在一个简短的声明中这样做(所以不要创建三个不同的数据帧,然后加入它们)。

编辑

我注意到这个问题被忽视了。如果有人能提到为什么帖子被低估了,我可能有机会改进这个问题。

3 个答案:

答案 0 :(得分:3)

使用pandas groupby.apply(),您可以在groupby聚合中运行多个函数。请注意,对于统计功能,您需要安装scipy。对于自定义函数,需要为分组数据运行类似sum()的聚合:

def customfct(x,y):
    data = x / y
    return data.mean()

def f(row):  
    row['m_weight'] = row['weight'].mean()
    row['var_time'] = row['Time'].var()
    row['cov'] = row['weight'].cov(row['Time'])
    row['odd_stat'] = customfct(row['weight'], row['Time'])
    return row

aggdf = df.groupby('Diet').apply(f)

答案 1 :(得分:2)

从版本0.16.0开始,pandas提供了assign()方法。我不确定它与@akrun提到的pandas-ply究竟有什么比较,但它是大熊猫的一部分。我认为这可以处理你所有的需求,除了可能是groupby部分(或者我可能不知道如何与groupby结合)。

Documentation for pandas assign

  

受dplyr的mutate动词的启发,DataFrame有一个新的assign()方法。 assign的函数签名只是** kwargs。键是新字段的列名,值是要插入的值(例如,Series或NumPy数组),或者是要在DataFrame上调用的一个参数的函数。插入新值,并返回整个DataFrame(包含所有原始列和新列)。

看看你的示例代码,我不知道怎么做groupby,但你当然可以做这种事情。 (实际上,如果我无法弄明白,我可以发布一个后续问题。)

df.assign( mean_weight = lambda x: x['weight'].mean(),
           var_time    = lambda x: x['time'].var(),
           covar       = lambda x: np.cov(x.t1,x.t2)[0,0] )

或者,可以这样做:

df.assign( mean_weight = df['weight'].mean(),
           var_time    = df['time'].var(),
           covar       = np.cov(df['t1'],df['t2'])[0,0] )

或者,你可以像这样包含groupby(混合下面的替代方法):

df.assign( mean_weight = df['weight'].groupby(df.diet).transform('mean'),
           var_time    = lambda x: x['time'].groupby(x['diet']).transform('mean') )

但是你必须做4x而不是1x的小组,所以这不是一个真正令人满意的解决方案...

我会更多地使用该语法,看看我是否可以更接近您的示例(您可能希望提供示例数据以获得更好的答案)。

或者您可以使用标准的groupby技术来获得答案,但我认为它需要多个语句(不能只做一个长链接行)因为复杂性 - 您的一些作业可以与groupby和#39; s agg但我不认为用户功能可以。

答案 2 :(得分:0)

我带了 datar 来让您将 R 代码翻译成 Python:

>>> from pipda import register_func
>>> from datar.all import f, length, group_by, summarise, mean, var, cov
>>> from datar.datasets import ChickWeight
>>> 
>>> @register_func(None)
... def custom_func(col1, col2):
...     return length(col1) + length(col2)
... 
>>> ChickWeight >> \
...     group_by(f.Diet) >> \
...     summarise(
...         m_weight=mean(f.weight),
...         var_time = var(f.Time),
...         covar = cov(f.weight, f.Time),
...         odd_stat = custom_func(f.weight, f.Time)
...     )
     Diet    m_weight   var_time       covar  odd_stat
  <int64>   <float64>  <float64>   <float64>   <int64>
0       1  102.645455  45.422397  312.189871       440
1       2  122.616667  45.909722  398.564426       240
2       3  142.950000  45.909722  528.827731       240
3       4  135.262712  45.100618  441.868535       236

我是包的作者。如果您有任何问题,请随时提交问题。