Pandas 1.1.5如何按含不匹配值的自定义列表对DataFrame索引排序
pandas 1.1.5 按自定义列表对DataFrame索引排序实现
本方法完全适配pandas 1.1.5版本,可同时处理自定义排序列表不包含DataFrame全部索引、列表包含索引不存在的额外值两种场景。
实现方法1:索引筛选拼接法(逻辑直观,无需修改索引类型)
核心逻辑:先提取自定义列表中在当前DataFrame索引里存在的元素(保持列表原有顺序),再拼接DataFrame中不在排序列表里的剩余索引,最后用reindex方法重排即可。
完整代码示例:
import pandas as pd # 构造示例数据 df = pd.DataFrame( {'Revenue': [1, 6, 0], 'Cost': [2, 3, 10]}, index=['Firm AC', 'Firm B', 'Firm ZZ'] ) ordered_list = ['Firm AA', 'Firm ZZ', 'Firm C', 'Firm B'] # 1. 提取排序列表中存在于DataFrame索引的部分,保留原有排序 sorted_exist_idx = [idx for idx in ordered_list if idx in df.index] # 2. 提取DataFrame中不在排序列表的剩余索引,如需对剩余索引按字母序排序可在外层加sorted() remaining_idx = [idx for idx in df.index if idx not in ordered_list] # 3. 重排DataFrame df_sorted = df.reindex(sorted_exist_idx + remaining_idx)
实现方法2:分类索引排序法(代码更简洁)
核心逻辑:将DataFrame索引转为有序分类类型,分类顺序设置为自定义排序列表,不在分类列表中的索引会被标记为缺失值,排序时缺失值默认排在末尾。
完整代码示例:
import pandas as pd # 构造示例数据同方法1 df = pd.DataFrame( {'Revenue': [1, 6, 0], 'Cost': [2, 3, 10]}, index=['Firm AC', 'Firm B', 'Firm ZZ'] ) ordered_list = ['Firm AA', 'Firm ZZ', 'Firm C', 'Firm B'] # 将索引转为有序分类,按分类顺序排序 df.index = pd.Categorical(df.index, categories=ordered_list, ordered=True) df_sorted = df.sort_index() # 如后续不需要保留分类类型,可将索引转回字符串 # df_sorted.index = df_sorted.index.astype(str)
结果验证
两种方法得到的df_sorted都符合预期输出:
| Revenue | Cost | |
|---|---|---|
| Firm ZZ | 0 | 10 |
| Firm B | 6 | 3 |
| Firm AC | 1 | 2 |
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

