Pandas groupby 和聚合列之间的一些操作
Pandas groupby and aggregate on some operation between columns
我是 R
和 data.table
用户,尝试使用更多 Python
和 pandas
,当我想在 [=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
中,如果我想对 b
和 c
的乘积求和并除以 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
我是 R
和 data.table
用户,尝试使用更多 Python
和 pandas
,当我想在 [=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
中,如果我想对 b
和 c
的乘积求和并除以 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