繁体   English   中英

Python GroupBy sort 按分组内的列降序

[英]Python GroupBy sort Descending by column within grouping

我有一个包含以下列的数据集 - ID、旧阶段、新阶段和周期编号。 每个ID都有多行(2+),描绘了新旧之间的一系列来回阶段; 这由周期编号详细说明。

我正在尝试按 ID 对多行进行分组(没关系),但在该分组中我想按周期编号排序。 例如,如果 ID 1 有 6 个周期,我希望首先列出周期 #6,然后是 5、4、3 等。

grouped2 = df.groupby(['ID', 'Old_Stage', 'New_Stage'], as_index=False)['Cycle_Number'].max().sort_values(['Cycle_Number'], ascending=False)
print(grouped2)

这是我尝试过的,但是,它仅按整体降序对 Cycle Numbers 进行排序,而不是在 ID grouping中。

编辑

当前 dataframe:

|ID |Old Stage   |New Stage   |Cycle Number|
|100|In Progress |Under Review|1
|100|Not Started |In Progress |0
|100|Under Review|Completed   |2
|100|Completed   |In Progress |3

所需的 dataframe:

|ID |Old Stage   |New Stage   |Cycle Number|
|100|Completed   |In Progress |3
|   |Under Review|Completed   |2
|   |In Progress |Under Review|1
|   |Not Started |In Progress |0

正如furasjezrael提到的,使用pandas.DataFrame.sort_values ,如下,应该解决OP的问题

df = df.sort_values(by=['ID', 'Cycle Number'], ascending=[True, False])

[Out]:
    ID     Old Stage     New Stage  Cycle Number
3  100     Completed   In Progress             3
2  100  Under Review     Completed             2
0  100   In Progress  Under Review             1
1  100   Not Started   In Progress             0

但是,OP提到

它不会按 ID 分组

似乎 OP 指的是索引的顺序。 正如人们在之前的 dataframe 的 output 上看到的那样,它从 3 变为 2,变为 0,变为 1,并且,IIUC,OP 希望它从 0 变为 1,变为 2,依此类推。

如果是这种情况,那么缺少的只是.reset_index(drop=True)如下

df = df.sort_values(by=['ID', 'Cycle Number'], ascending=[True, False]).reset_index(drop=True)

[Out]:
    ID     Old Stage     New Stage  Cycle Number
0  100     Completed   In Progress             3
1  100  Under Review     Completed             2
2  100   In Progress  Under Review             1
3  100   Not Started   In Progress             0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM