Pandas groupby 和聚合列之间的一些操作

Pandas groupby and aggregate on some operation between columns

我是 Rdata.table 用户,尝试使用更多 Pythonpandas,当我想在 [=17= 中执行以下操作时], 我很沮丧,因为似乎没有简单的方法:

df = pd.DataFrame({'a': [1, 1, 2, 2], 'b': [0.2, 0.2, 0.2, 0.1], 'c': [10, 9, 10, 22], 'd': [2, 3, 3, 1]})

R 中,如果我想对 bc 的乘积求和并除以 d 的总和,在 a 上分组,我会这样做:

df[, sum(b*c)/sum(d), by=a]

,但这对我来说似乎很难在 pandas 中优雅地做到。我没有冒犯的意思,请不要讨厌我,可能只是我还没有理解pandas

目前的解决方案:

df[["b", "c"]].prod(axis=1).groupby(df["a"]).sum()/df.groupby("a").d.sum()

我也会像你那样做的。

如果你愿意你也可以使用groupby.apply:

df.groupby('a').apply(lambda g: (g['b']*g['c']).sum()/g['d'].sum())

输出:

a
1    0.76
2    1.05
dtype: float64

如果性能很重要,请避免 groupby.apply - 创建辅助列 new,聚合两个列并最后划分两个列:

s = (df.assign(new = df[["b", "c"]].prod(axis=1))
       .groupby("a")[['new','d']]
       .sum()
       .eval('new / d'))
print (s)
a
1    0.76
2    1.05
dtype: float64