我想对分组依据进行排序,但是我很难准确地按照自己的意愿进行分组。在探索“分组依据”时,我只想出更多的问题。 无论如何,让我奠定基础。我们有这个数据集:
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 3
基本上,我希望按每个groupby中的值的总和对这些组进行降序排序,然后按该顺序放回数据框中。
groupby必不可少的将每个组分成4s:
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
值: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
值: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
值: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
问题是...。这只是10000行数据集的一个很小的样本。当我对小样本集进行排序时,它可以工作,但是当对大量列表进行排序时,排序不会保持驱动程序,手枪,手枪,监视顺序。像手枪驾驶员手枪监视之类的每个组混合出来。我想在排序后保持角色顺序。 让我们用尽我所尝试的。 我尝试过:
尝试排序如下:
grp = df.groupby(np.arange(len(df.index))//4)
grp[['Value']].transform(sum).sort('Value')
sort1 = df.loc[grp[['Value']].transform(sum).sort_values('Value').index]
尝试使用键(而不是值)来做到这一点。
创建密钥并按密钥排序:
df['key']=df['Value'].groupby(np.arange(len(df))//4).transform('sum')
df=df.sort_values('key',ascending=False)
我还相信groupby上的排序会自动设置为true,我将其设置为false和true仍然不正确。
这很好,直到排序发生为止,看来groupby一直保持排序直到排序。
有没有一种方法可以硬性指定我希望排序顺序准确地是Driver,Pistol,Pistol,Lookout,或者是否可以弄清楚我希望的分组顺序
gr = df.groupby(np.arange(len(df.index.values))//4)
grp_order = (gr.sum()).sort_values('Value', ascending=False).index
是否有一种方法可以使用grp_order告诉groupby(“仍在分组时”)根据grp_order来重新安排自己在数据框中的位置,
如果可能,我们可以避免for循环,则数据集可能会变大,我希望速度尽可能快。数周以来一直在愚蠢地殴打我的大脑,试图弄清楚我哪里出了问题。
答案 0 :(得分:1)
.groupby
并不存在问题,因为可以保证在每个组中保持顺序。这部分信息隐藏在文档的sort
参数下
sort:布尔值,默认为True
排序组键。关闭此功能可获得更好的性能。 请注意 不会影响每个组中观察的顺序。 groupby保留每个组中行的顺序。
由于输出不是驱动程序手枪手枪监视的顺序,因此基础数据框的排序方式不是每个组都这样。定义另一个键,然后基于两个键进行排序:
df['key'] = df.groupby(df.index.values//4).Value.transform(sum)
df['key2'] = df.Role.map({'Driver': 1, 'Pistol': 2, 'Lookout': 3})
df = df.sort_values(['key', 'key2'], ascending=[False, True])
Name Role Cost Value key key2
4 Johnny_Tsunami Driver 1000 39 165 1
5 Michael_B._Jackson Pistol 2500 46 165 2
6 Bobby_Zuko Pistol 3000 50 165 2
7 Appa_Derren Lookout 250 30 165 3
8 Baby_Hitsuo Driver 950 35 161 1
9 Michael_B._Jackson Pistol 2500 46 161 2
11 Bobby_Zuko Pistol 3000 50 161 2
10 Appa_Derren Lookout 250 30 161 3
0 Johnny_Tsunami Driver 1000 39 160 1
1 Michael_B._Jackson Pistol 2500 46 160 2
2 Bobby_Zuko Pistol 3000 50 160 2
3 Greg_Ritcher Lookout 200 25 160 3
df
:最后两行被交换
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 Appa_Derren Lookout 250 30
11 Bobby_Zuko Pistol 3000 50