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

Pandas DataFrame按整数、数字字符串混合、纯字符串排序求助

Pandas DataFrame按指定规则排序问题

需求说明

需要对DataFrame的name列按以下规则排序:

  • 纯整数(含字符串形式纯数字)排在最前
  • 数字与字符串混合类型次之
  • 纯字符串类型排在最后

原始数据

import pandas as pd

df = pd.DataFrame({'name': ['aaa', 'ccc', 'bbb', '1c2z45zz', 55, 3, 'et45']})

期望输出

df = pd.DataFrame({'name': [3, 55, '1c2z45zz', 'et45', 'aaa', 'bbb', 'ccc']})

已尝试方法(均未得到预期结果)

  1. 使用natsort库:
import natsort

df.iloc[natsort.index_humansorted(df.name)]
  1. 字符串填充排序:
max_length = max(df.name.str.len())
df['sort_name']=df.name.str.pad(max_length,'right','~')
df.sort_values('sort_name', inplace=True, ignore_index=True)
  1. 自定义key排序:
df_sorted = df.astype(str).sort_values(by='name',key=lambda x: (x.isdigit(), x))

解决方案

核心是通过自定义排序key,给不同类型元素分配优先级,再按优先级+内容排序:

import pandas as pd

df = pd.DataFrame({'name': ['aaa', 'ccc', 'bbb', '1c2z45zz', 55, 3, 'et45']})

def sort_key(x):
    # 处理纯整数或字符串形式纯数字,优先级0,按数值排序
    if isinstance(x, int):
        return (0, x)
    str_x = str(x)
    if str_x.isdigit():
        return (0, int(str_x))
    # 处理数字+字符串混合类型,优先级1,按字符串自然排序
    if any(c.isdigit() for c in str_x):
        return (1, str_x)
    # 处理纯字符串,优先级2,按字符串自然排序
    return (2, str_x)

# 应用自定义key排序
df_sorted = df.sort_values(by='name', key=lambda col: col.apply(sort_key), ignore_index=True)
print(df_sorted)

执行后输出:

name
0          3
1         55
2  1c2z45zz
3      et45
4       aaa
5       bbb
6       ccc

代码说明

  • 优先级规则:纯数字类(int/字符串纯数字)> 混合类型 > 纯字符串
  • 同一优先级内:数字按数值大小排序,字符串按自然顺序排序
  • 利用元组排序特性,先比较优先级(元组第一个元素),再比较内容(元组第二个元素)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:25:10