我正在尝试查找组中的值的总和,但是问题是我只需要选择组中的3个可能的最高值,然后将每个组的值求和。
我有一个像这样的数据框:
group amount
x 12
x 345
x 3
y 1
y 45
z 14
x 4
x 52
y 54
z 23
z 235
z 21
y 57
y 3
z 87
在SQL中,我可以这样使用查询:
选择组,总和(金额)来自(选择组,金额,row_number()超过(按组顺序划分,按金额desc)来自tbla的rownum)z 其中z.rownum在1和3之间 分组
分组之前我想要的结果:
group amount
x 12
x 345
y 45
x 52
y 54
z 23
z 235
y 57
z 87
基于此结果,我想获得每个组的总和
最终结果
Group Amount
X 409
Y 156
Z 345
答案 0 :(得分:3)
感谢 @ScottBoston ,我认为我们可以使用nth()
代替head()
来使用sum(level=0)
。另一种选择是在以前使用set_index()
,而不是使用groupby两次的旧解决方案。无论如何,按照速度的顺序,最快的要优先:
dfout = (df.sort_values(by='amount', ascending=False)
.groupby('group')
.head(3)
.set_index('group')
.sum(level=0)
.reset_index())
或
dfout = (df.sort_values(by='amount', ascending=False)
.groupby('group')
.nth([0,1,2])
.sum(level=0)
.reset_index())
或
dfout = (df.groupby('group')
.apply(lambda x: x['amount'].sort_values(ascending=False).head(3).sum())
.rename('amount')
.reset_index())
或采用两步方法来获取您的临时数据帧,如问题所示:
mid = df.sort_values(by='amount', ascending=False).groupby('group').head(3).sort_index()
final = mid.set_index('group').sum(level=0)
完整示例:
import pandas as pd
data = '''\
group,amount
x,12
x,345
x,3
y,1
y,45
z,14
x,4
x,52
y,54
z,23
z,235
z,21
y,57
y,3
z,87'''
fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj)
dfout = (df.sort_values(by='amount', ascending=False)
.groupby('group')
.nth([0,1,2])
.sum(level=0)
.reset_index())
print(dfout)
返回:
group amount
0 x 409
1 y 156
2 z 345