有没有其他行号替代项,例如python中的SQL?

时间:2018-07-08 21:31:54

标签: pandas python-3.6 pandas-groupby

我正在尝试查找组中的值的总和,但是问题是我只需要选择组中的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

1 个答案:

答案 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