【发布时间】:2019-06-04 09:14:48
【问题描述】:
我想对 groupby 进行排序,但我无法完全按照自己的意愿进行排序,当我探索“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本质将每个组分成4个:
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 行数据集的一个小样本。当我对小样本集进行排序时它可以工作,但是当我对大量列表进行排序时,排序不会保持 Driver、Pistol、Pistol、Lookout 的顺序。它像 Pistol Driver Pistol Lookout 这样的小组混在一起。我想在排序后保持角色顺序。 让我们来看看我尝试过的东西。 我试过了:
尝试如下排序:
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 循环,数据集可能会变大我希望速度尽可能快。几个星期以来一直在愚蠢地敲打我的大脑,试图找出我哪里出错了。
【问题讨论】:
-
我没有看到您定义
key然后根据它进行排序的方法的问题;它是正确的。.groupby不会更改组内的排序顺序。如果是这样,.diff、.cumsum和.cumcount之类的方法将完全没用。文档特别声明groupby preserves the order of rows within each group.如果您的输出中的排序不是Driver Pistol Pistol Lookout,那是因为在您分组之前不是这种情况
标签: pandas python-2.7 sorting dataframe pandas-groupby