通过使用其他方法对组进行排序时保持顺序?

时间:2019-01-09 14:52:01

标签: pandas python-2.7 sorting dataframe pandas-groupby

我想对分组依据进行排序,但是我很难准确地按照自己的意愿进行分组。在探索“分组依据”时,我只想出更多的问题。 无论如何,让我奠定基础。我们有这个数据集:

                  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循环,则数据集可能会变大,我希望速度尽可能快。数周以来一直在愚蠢地殴打我的大脑,试图弄清楚我哪里出了问题。

1 个答案:

答案 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