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

如何在DataFrame中按指定规则转换列并生成排序后的新列?

Pandas字符串列格式转换与自定义排序实现

需求说明

有一个Pandas DataFrame的字符串列,满足以下规则:

  • 所有字符串以字母开头,可以字母结尾
  • 用英文句点.分隔各段内容
  • 分隔后的数字段长度为1位或2位

需要完成两项操作:

  1. 生成新列:将.替换为_,数字段补零至2位,字母段转为大写
  2. 按「先字母、再数字」的层级规则对DataFrame排序,得到指定格式结果

输入示例

Col
H.14.01.2
H.14.01.11
H.14.2
H.14.01.12
H.14.01.20
H.14.02.02
H.14.02.J
H.14.01.1
H.14.01.A
H.14.01.11.1
H.14.01.12.b

期望输出

Required
H_14_01_01
H_14_01_02
H_14_01_11
H_14_01_11_01
H_14_01_12
H_14_01_12_B
H_14_01_20
H_14_01_A
H_14_02
H_14_02_02
H_14_02_J

实现代码

1. 导入库并构造示例数据

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'Col': [
        'H.14.01.2', 'H.14.01.11', 'H.14.2', 'H.14.01.12', 'H.14.01.20',
        'H.14.02.02', 'H.14.02.J', 'H.14.01.1', 'H.14.01.A', 'H.14.01.11.1',
        'H.14.01.12.b'
    ]
})

2. 定义格式转换函数并生成新列

def format_column(s):
    # 按句点拆分字符串
    parts = s.split('.')
    processed_parts = []
    for part in parts:
        if part.isdigit():
            # 数字补零到2位
            processed_parts.append(part.zfill(2))
        else:
            # 字母转大写
            processed_parts.append(part.upper())
    # 用下划线拼接
    return '_'.join(processed_parts)

# 生成新列Required
df['Required'] = df['Col'].apply(format_column)

3. 自定义排序规则并排序

def get_sort_key(s):
    # 按下划线拆分排序键
    key_parts = []
    for part in s.split('_'):
        if part.isdigit():
            # 数字转为整数,确保按数值排序
            key_parts.append(int(part))
        else:
            # 字母保持字符串,按字母顺序排序
            key_parts.append(part)
    return key_parts

# 按自定义key排序,重置索引
df_sorted = df.sort_values(by='Required', key=lambda x: x.apply(get_sort_key)).reset_index(drop=True)

4. 查看结果

# 打印最终结果的Required列
print(df_sorted['Required'])

运行后即可得到符合要求的排序结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:15:33