Pandas 如何按组和对groupby进行排序?

Pandas 如何按组和对groupby进行排序?,pandas,python-2.7,Pandas,Python 2.7,我现在有个问题,很难解释。我有一个数据帧,它已经被分组成4s。条目的每一行都有一个名为Value的列 Name Role Cost Value 0 Johnny Tsunami Driver 1000 39 1 Michael B. Jackson Pistol 2500 46 2 Bobby Zuko Pistol 3000 50 3 Greg Ri

我现在有个问题,很难解释。我有一个数据帧,它已经被分组成4s。条目的每一行都有一个名为Value的列

                 Name      Role  Cost  Value  
0       Johnny Tsunami   Driver  1000     39
1   Michael B. Jackson   Pistol  2500     46
2           Bobby Zuko   Pistol  3000     50
3         Greg Ritcher  Lookout   200     25
4       Johnny Tsunami   Driver  1000     39
5   Michael B. Jackson   Pistol  2500     46
6           Bobby Zuko   Pistol  3000     50
7          Appa Derren  Lookout   250     30
8          Baby Hitsuo   Driver   950     35
9   Michael B. Jackson   Pistol  2500     46
10          Bobby Zuko   Pistol  3000     50
11         Appa Derren  Lookout   250     30
基本上,我希望组按每个groupby中的值之和降序排序

看起来应该是简单的。我已经尝试了很多方法,并得到了各种错误,例如:sum()not和attribute、str问题、dataframe对象问题。我试过使用sort,sum,lambda,agg函数。我不敢相信我在按降序排列groupby时遇到了问题。这里是一个片段和图片

groupby主要对上述数据帧执行此操作:

0
                 Name     Role  Cost  Value
0      Johnny Tsunami   Driver  1000     39
1  Michael B. Jackson   Pistol  2500     46
2          Bobby Zuko   Pistol  3000     50
3        Greg Ritcher  Lookout   200     25

Cost: 6700   Value: 160

1
                 Name     Role  Cost  Value
4      Johnny Tsunami   Driver  1000     39
5  Michael B. Jackson   Pistol  2500     46
6          Bobby Zuko   Pistol  3000     50
7         Appa Derren  Lookout   250     30

Cost: 6750   Value: 165

2
                  Name     Role  Cost  Value
8          Baby Hitsuo   Driver   950     35
9   Michael B. Jackson   Pistol  2500     46
10          Bobby Zuko   Pistol  3000     50
11         Appa Derren  Lookout   250     30

Cost: 6700   Value: 161
排序时,我希望打印数据帧和最终结果:

4       Johnny Tsunami   Driver  1000     39
5   Michael B. Jackson   Pistol  2500     46
6           Bobby Zuko   Pistol  3000     50
7          Appa Derren  Lookout   250     30
8          Baby Hitsuo   Driver   950     35
9   Michael B. Jackson   Pistol  2500     46
10          Bobby Zuko   Pistol  3000     50
11         Appa Derren  Lookout   250     30
0       Johnny Tsunami   Driver  1000     39
1   Michael B. Jackson   Pistol  2500     46
2           Bobby Zuko   Pistol  3000     50
3         Greg Ritcher  Lookout   200     25
以下是数据帧和代码:

from pprint import pprint
import pandas as pd
import numpy as np

data= [['Johnny Tsunami','Driver',1000,39],
['Michael B. Jackson','Pistol',2500,46],
['Bobby Zuko','Pistol',3000,50],
['Greg Ritcher','Lookout',200,25],
['Johnny Tsunami','Driver',1000,39],
['Michael B. Jackson','Pistol',2500,46],
['Bobby Zuko','Pistol',3000,50],
['Appa Derren','Lookout',250,30],
['Baby Hitsuo','Driver',950,35],
['Michael B. Jackson','Pistol',2500,46],
['Bobby Zuko','Pistol',3000,50],
['Appa Derren','Lookout',250,30]]

df = pd.DataFrame(data,columns=['Name','Role','Cost','Value'])

#groupby4s
gr = df.groupby(np.arange(len(df.index))/4)

我会这样做:

首先创建4个组,对它们进行排序,并保存索引顺序(将构建组的代码更改为使用整数除法)

然后按正确的顺序打印:

for idx in grp_order:
    print(idx)
    print(gr.get_group(idx))
    print('Cost: ', gr.get_group(idx).Value.sum())
输出:

1
                 Name     Role  Cost  Value
4      Johnny Tsunami   Driver  1000     39
5  Michael B. Jackson   Pistol  2500     46
6          Bobby Zuko   Pistol  3000     50
7         Appa Derren  Lookout   250     30
Cost:  165
2
                  Name     Role  Cost  Value
8          Baby Hitsuo   Driver   950     35
9   Michael B. Jackson   Pistol  2500     46
10          Bobby Zuko   Pistol  3000     50
11         Appa Derren  Lookout   250     30
Cost:  161
0
                 Name     Role  Cost  Value
0      Johnny Tsunami   Driver  1000     39
1  Michael B. Jackson   Pistol  2500     46
2          Bobby Zuko   Pistol  3000     50
3        Greg Ritcher  Lookout   200     25
Cost:  160

使用
transform
创建附加键,然后按
sort\u值对键进行排序

df['key']=df['Value'].groupby(np.arange(len(df))//4).transform('sum')
df=df.sort_values('key',ascending=False)
df
Out[104]: 
                  Name     Role  Cost  Value  key
4       Johnny Tsunami   Driver  1000     39  165
5   Michael B. Jackson   Pistol  2500     46  165
6           Bobby Zuko   Pistol  3000     50  165
7          Appa Derren  Lookout   250     30  165
8          Baby Hitsuo   Driver   950     35  161
9   Michael B. Jackson   Pistol  2500     46  161
10          Bobby Zuko   Pistol  3000     50  161
11         Appa Derren  Lookout   250     30  161
0       Johnny Tsunami   Driver  1000     39  160
1   Michael B. Jackson   Pistol  2500     46  160
2           Bobby Zuko   Pistol  3000     50  160
3         Greg Ritcher  Lookout   200     25  160


请注意,我没有删除为排序而创建的键,您可以执行
df=df.drop('key',1)
来删除它

我认为输出的顺序不正确对建议的解决方案有任何反馈吗?为什么两个斜杠(len(df))//4而不是一个请解释,df['key']=df['Value'].groupby(np.arange(len(df))//4.transform('sum')当数据帧按4分组时,还有另一种按键排序的方法吗。我这样问是因为无论出于什么原因,当我这样做的时候,我的驾驶员手枪和了望台就像手枪驾驶员了望台手枪一样,每一组都失灵了。我想在分类后保持每组驾驶员手枪了望台的原始顺序。谢谢,使用此功能可以获得比我最初寻找的更好的解决方案,使用索引的好主意我将把它放在我的任务框中。
df['key']=df['Value'].groupby(np.arange(len(df))//4).transform('sum')
df=df.sort_values('key',ascending=False)
df
Out[104]: 
                  Name     Role  Cost  Value  key
4       Johnny Tsunami   Driver  1000     39  165
5   Michael B. Jackson   Pistol  2500     46  165
6           Bobby Zuko   Pistol  3000     50  165
7          Appa Derren  Lookout   250     30  165
8          Baby Hitsuo   Driver   950     35  161
9   Michael B. Jackson   Pistol  2500     46  161
10          Bobby Zuko   Pistol  3000     50  161
11         Appa Derren  Lookout   250     30  161
0       Johnny Tsunami   Driver  1000     39  160
1   Michael B. Jackson   Pistol  2500     46  160
2           Bobby Zuko   Pistol  3000     50  160
3         Greg Ritcher  Lookout   200     25  160