DataFrame按日期排序并在日期分组内指定status分类排序的实现
解决方案
要实现先按日期排序,每个日期分组内status为B的条目排在S之前,且保留所有日期的所有记录,可以通过以下两种方式实现:
方法一:利用字符自然排序
由于字母B的ASCII码小于S,直接通过sort_values指定两级排序键即可,先按date升序,再按status升序:
tempDF_sorted = tempDF.sort_values(by=['date', 'status'], ascending=[True, True])
方法二:自定义排序优先级(更严谨)
如果后续可能新增其他status值,或者需要明确指定排序规则,可以通过映射生成排序辅助列,确保B始终排在S前面:
# 给status分配排序权重,B权重为0,S权重为1 tempDF['status_priority'] = tempDF['status'].replace({'B': 0, 'S': 1}) # 按日期和权重排序,最后删除辅助列 tempDF_sorted = tempDF.sort_values(by=['date', 'status_priority']).drop('status_priority', axis=1)
原代码问题分析
你之前的代码tempDF.sort_values(['status']).groupby(tempDF['date']).head(2)存在两个问题:
- 先全局按
status排序,导致所有B条目集中在前,破坏了日期的分组逻辑 - 使用
head(2)会限制每个日期组最多保留2条记录,不符合你"保留仅含单一条目的日期记录"的需求
内容的提问来源于stack exchange,提问作者ThatQuantDude
相关产品推荐
相关产品推荐

