Python:按指定自定义列表对DataFrame进行排序/分组的需求
解决方案:按自定义规则排序Pandas DataFrame
没问题,这个排序需求用Pandas就能完美实现,我给你一步步拆解方案:
核心思路
我们需要把DataFrame分成三个优先级组,严格按照以下顺序排列:
- 第一组:所有
Id为CN05059815且该Id不在目标列表中的行 - 第二组:所有
Id在目标列表中的行,并且严格遵循列表的顺序 - 第三组:剩下的所有行(既不是
CN05059815,也不在目标列表中)
完整代码示例
import pandas as pd # 先构建你的示例DataFrame(替换成你实际的DataFrame) data = { 'Id': ['CN05059815', 'CN05059815', 'CN05059830', 'CN05060064', 'CN05059946', 'CN05060010', 'CN05060100'], 'Direction': ['LoadFWD', 'LoadBWD', 'LoadFWD', 'LoadBWD', 'LoadFWD', 'LoadBWD', 'LoadFWD'], 'Load': ['0,0', '0,0', '10,0', '20,0', '15,0', '5,0', '25,0'], 'Unit': [None, None, None, None, None, None, None] } df = pd.DataFrame(data) # 目标列表(注意别用`list`当变量名,会覆盖Python内置函数) target_list = ['CN05059830','CN05059946','CN05060010','CN05060064'] ### 步骤1:添加分组标记列 # 给每行打上所属组的标签,明确排序优先级 df['sort_group'] = df['Id'].apply( lambda x: '第一组' if x == 'CN05059815' and x not in target_list else ('第二组' if x in target_list else '第三组') ) ### 步骤2:定义分组的排序顺序 # 将分组列转为**有序分类类型**,这样排序时会严格按照我们指定的顺序来 df['sort_group'] = pd.Categorical(df['sort_group'], categories=['第一组', '第二组', '第三组'], ordered=True) ### 步骤3:定义第二组内的Id顺序 # 把Id列也转为有序分类,确保第二组内的行完全遵循target_list的顺序 df['Id'] = pd.Categorical(df['Id'], categories=target_list, ordered=True) ### 步骤4:执行排序 # 先按分组优先级排序,再按Id的自定义顺序排序 sorted_df = df.sort_values(by=['sort_group', 'Id']) ### 步骤5:删除辅助列(可选,如果你不需要保留分组标记) sorted_df = sorted_df.drop('sort_group', axis=1) # 查看结果 print(sorted_df)
代码说明
- 分组标记:通过
apply函数给每行打上分组标签,精准区分三个优先级的行 - 有序分类:Pandas的
Categorical类型是实现自定义排序的关键,它能让我们强制指定排序的顺序,而不是默认的字母/数字顺序 - 稳定排序:
sort_values默认是稳定排序,同一组内的行会保留原DataFrame中的相对顺序(比如同一Id的多行不会被打乱)
特殊情况处理
如果CN05059815恰好出现在你的target_list中,代码会自动把它的行归到第二组,遵循列表的顺序——这完全符合你“先保留不属于列表的CN05059815”的需求。
内容的提问来源于stack exchange,提问作者khalildz34
相关产品推荐
相关产品推荐

