【问题标题】:Maintain order while sorting groupby using alternative methods?使用替代方法对分组进行排序时保持顺序?
【发布时间】: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


【解决方案1】:

问题不在于.groupby,因为它保证在每个组内保持顺序,这部分信息隐藏在文档中的sort 参数下

排序:布尔值,默认为真

对组键进行排序。关闭此功能可获得更好的性能。 注意这一点 不影响每组内观察的顺序。 groupby 保留每个组内的行顺序。

由于输出不是 Driver Pistol Pistol Lookout 排序,因此您的基础 DataFrame 不会像每个组那样排序。定义另一个键,并根据两个键进行排序:

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

【讨论】:

    猜你喜欢
    • 2018-06-04
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多