Pandas 如何按组和对groupby进行排序?
我现在有个问题,很难解释。我有一个数据帧,它已经被分组成4s。条目的每一行都有一个名为Value的列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
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