Pandas python中是否有类似SQL的行号替代方案?

Pandas python中是否有类似SQL的行号替代方案?,pandas,python-3.6,pandas-groupby,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个值,然后为每个组求和这些值。 我有这样一个数据框:

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中,我可以使用如下查询:

选择组,从选择组中选择sumamount total,amount,按组超额分配按金额描述tbla z中的rownum 其中z.rownum介于1和3之间 一组一组

在分组之前,我想要的结果:

  group  amount
   x      12
   x     345
   y      45
   x      52
   y      54
   z      23
   z     235
   y      57
   z      87   
根据这个结果,我想得到每组的总和

最终结果

感谢@ScottBoston,我看得更远,认为我们可以使用N而不是head来使用sumlevel=0。另一种选择是在之前设置_索引,而不是我两次使用groupby的旧解决方案。无论如何,按照速度的顺序,最快优先:

dfout = (df.sort_values(by='amount', ascending=False)
         .groupby('group')
         .head(3)
         .set_index('group')
         .sum(level=0)
         .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
感谢@ScottBoston,我看得更远,认为我们可以使用N而不是head来使用sumlevel=0。另一种选择是在之前设置_索引,而不是我两次使用groupby的旧解决方案。无论如何,按照速度的顺序,最快优先:

dfout = (df.sort_values(by='amount', ascending=False)
         .groupby('group')
         .head(3)
         .set_index('group')
         .sum(level=0)
         .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

@斯科特伯顿,我知道了。head-on-groupby返回一个没有groupby对象作为索引的数据帧。所以我们忽略了应该设置索引“组”的事实。另一种选择是使用nth。谢谢你让我好奇:谢谢@Anton vBR和Scott Boston为你提供的时间和信息。我只是想知道重置索引会做什么,然后我看了看结果,排序与我之前的不同。这是使用重置索引吗?确保先前的行顺序保持不变。@Avi是否要中间数据帧?然后您可以这样做,例如:df.sort_valuesby='amount',ascending=False.groupby'group'.head3.sort_index。最后的reset_索引只是将组列从索引移到一列,就像您可能想要的那样。@ScottBoston我想出来了。head-on-groupby返回一个没有groupby对象作为索引的数据帧。所以我们忽略了应该设置索引“组”的事实。另一种选择是使用nth。谢谢你让我好奇:谢谢@Anton vBR和Scott Boston为你提供的时间和信息。我只是想知道重置索引会做什么,然后我看了看结果,排序与我之前的不同。这是使用重置索引吗?确保先前的行顺序保持不变。@Avi是否要中间数据帧?然后您可以这样做,例如:df.sort_valuesby='amount',ascending=False.groupby'group'.head3.sort_index。最后的reset_索引只是将组列从索引移到一列,就像您可能想要的那样。