You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动