如何在Pandas多级索引DataFrame中使用Natsort进行排序?
解决Pandas多级索引按自然排序quarter的问题
你的报错是因为Pandas 1.1.5版本的sort_index不支持对MultiIndex使用key参数,该版本中MultiIndex的isna方法未实现,导致调用natsort_keygen()时触发错误。以下是两种适配你版本的解决方案:
方案一:提取quarter数字排序(无需natsort)
直接从quarter中提取数字部分转为整数,以此作为排序依据,无需依赖第三方库:
# 将多级索引转为普通列 df_reset = df.reset_index() # 提取quarter中的数字并转为整数 df_reset['q_num'] = df_reset['quarter'].str.extract(r'Q(\d+)').astype(int) # 按date、code、q_num排序后还原索引 df_sorted = df_reset.sort_values(by=['date', 'code', 'q_num']) \ .drop('q_num', axis=1) \ .set_index(['date', 'code', 'quarter'])
方案二:用natsort生成排序索引
如果你更倾向于使用natsort的自然排序逻辑,可以通过生成排序索引来实现:
from natsort import index_humane # 转为普通列 df_reset = df.reset_index() # 生成quarter的自然排序位置索引 sort_pos = index_humane(df_reset['quarter']) # 按date、code和排序位置排序后还原索引 df_sorted = df_reset.iloc[sort_pos] \ .sort_values(by=['date', 'code']) \ .set_index(['date', 'code', 'quarter'])
两种方案都能实现Q1→Q2→…→Q9→Q10→Q11→Q12的自然排序,且适配你当前的Pandas 1.1.5版本。
内容的提问来源于stack exchange,提问作者Jas
相关产品推荐
相关产品推荐

