如何在Pandas中对分组内特定行优先排序后再按日期排序?
解决按ID分组后首实例行置顶+其余行按日期排序的问题
我来给你捋捋怎么搞定这个需求哈!核心思路就是给每个分组里的行加个排序优先级标记,让标记为first == 1的行拥有最高优先级(排在最前面),剩下的行再按入院日期正常排序就行。具体步骤如下:
步骤1:确保入院日期是日期格式
首先得把admit列转换成日期类型,不然字符串排序会乱掉(比如"3-4-2018"和"2-2-2018"直接按字符串排逻辑会出错):
import pandas as pd # 转换日期列,格式匹配你的示例数据(月-日-年) df['admit'] = pd.to_datetime(df['admit'], format='%m-%d-%Y')
步骤2:添加排序辅助列
我们新增一个sort_key列,给首实例行(first == 1)赋值0,其他行赋值1——这样排序的时候0会排在1前面,就能把首实例行固定在分组最顶部:
df['sort_key'] = df['first'].apply(lambda x: 0 if x == 1 else 1)
步骤3:分组排序
按ID分组后,先按sort_key升序(保证首实例行在前),再按admit升序(其余行按入院日期排序):
sorted_df = df.groupby('ID', group_keys=False).apply( lambda group: group.sort_values(by=['sort_key', 'admit'], ascending=[True, True]) )
步骤4:清理辅助列(可选)
如果不需要保留sort_key列,直接删掉就行:
sorted_df = sorted_df.drop('sort_key', axis=1)
效果验证
拿你给的示例数据来说,处理后ID=20的分组会变成:
ID admit discharge discharge_location first
20 2018-03-04 2018-03-06 Home 1
20 2018-02-02 2018-02-06 Home 0
20 2018-02-05 2018-02-23 ... 0
完美实现了首实例行置顶,其余行按入院日期排序的需求~
内容的提问来源于stack exchange,提问作者CandleWax




