You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:按指定自定义列表对DataFrame进行排序/分组的需求

解决方案:按自定义规则排序Pandas DataFrame

没问题,这个排序需求用Pandas就能完美实现,我给你一步步拆解方案:

核心思路

我们需要把DataFrame分成三个优先级组,严格按照以下顺序排列:

  1. 第一组:所有Id为CN05059815且该Id不在目标列表中的行
  2. 第二组:所有Id在目标列表中的行,并且严格遵循列表的顺序
  3. 第三组:剩下的所有行(既不是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)

代码说明

  1. 分组标记:通过apply函数给每行打上分组标签,精准区分三个优先级的行
  2. 有序分类:Pandas的Categorical类型是实现自定义排序的关键,它能让我们强制指定排序的顺序,而不是默认的字母/数字顺序
  3. 稳定排序:sort_values默认是稳定排序,同一组内的行会保留原DataFrame中的相对顺序(比如同一Id的多行不会被打乱)

特殊情况处理

如果CN05059815恰好出现在你的target_list中,代码会自动把它的行归到第二组,遵循列表的顺序——这完全符合你“先保留不属于列表的CN05059815”的需求。

内容的提问来源于stack exchange,提问作者khalildz34

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:58:50