如何在Pandas中按Datetime分层排序并保留已排序索引
解决方案
要实现按name分组后组内按timestamp排序,同时保留name的原始出现顺序,可以用groupby结合apply的方式,关键是设置groupby的sort=False来避免分组被自动按字母排序。
步骤1:确保时间戳是datetime类型
首先需要把timestamp列转换为datetime格式(如果你的数据还不是的话),这样排序才会按时间逻辑生效:
import pandas as pd # 转换timestamp为datetime类型 df['timestamp'] = pd.to_datetime(df['timestamp'])
步骤2:分组+组内排序
使用groupby按name分组,设置sort=False保留原始的name出现顺序,然后对每个分组应用sort_values按时间升序排序:
# 分组并组内排序,最后重置索引 df_sorted = df.groupby('name', sort=False).apply(lambda group: group.sort_values('timestamp')).reset_index(drop=True)
如果你的name已经是DataFrame的索引(即分层索引的一部分),只需要把groupby的参数改成level='name'即可:
df_sorted = df.groupby(level='name', sort=False).apply(lambda group: group.sort_values('timestamp')).reset_index(drop=True)
为什么直接用sort_values不行?
你之前执行的df.sort_values(by='timestamp', ascending=True)会把所有行按时间全局排序,完全打乱了name的分组结构,而我们需要的是每个name组内部独立按时间排序,同时组与组之间保持原来的顺序,groupby(sort=False)就能保证分组顺序和数据中name第一次出现的顺序一致,再结合组内排序就完美解决问题了。
内容的提问来源于stack exchange,提问作者Jeroen
相关产品推荐
相关产品推荐

