繁体   English   中英

Pandas:聚合具有多种功能的多列

[英]Pandas: aggregating multiple columns with multiple functions

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))

注意如何在一个语句中;

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

在熊猫中也可能出现这种模式吗? 请注意,我有兴趣在简短的声明中执行此操作(因此不要创建三个不同的数据帧然后加入它们)。

使用pandas groupby.apply(),您可以在groupby聚合中运行多个函数。 请注意,对于统计功能,您需要安装scipy 对于自定义函数,需要为groupwise数据运行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)

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

大熊猫分配的文档

灵感来自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的agg结合但我不喜欢认为用户功能可以。

我把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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM