Pandas python中是否有类似SQL的行号替代方案?
我试图找到组中的值之和,但问题是我只需要选择组中可能最高的3个值,然后为每个组求和这些值。 我有这样一个数据框: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
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_索引只是将组列从索引移到一列,就像您可能想要的那样。