[英]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.