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

如何用自定义顺序排序Pandas的string列并自然排序number列?

实现自定义字符串列排序+数字列自然排序的方法

你的问题出在原代码里sort_values的key参数会作用于所有指定的列,导致number列也被尝试映射自定义字典,打乱了数字的自然排序逻辑。要实现字符串列按自定义顺序排,数字列按自然顺序排,可以用以下两种方法:

方法1:添加辅助列(兼容所有pandas版本)

先给string列生成对应的排序键辅助列,再按辅助列+number列排序,最后删掉辅助列:

import pandas
import numpy

strs = ['custom','sort']*5
df = pandas.DataFrame(
    {
        'string': strs,
        'number': numpy.random.randn(len(strs)),
    }
)

sort_string_like_this = {'sort': 0, 'custom': 1}
# 生成排序辅助列
df['sort_key'] = df['string'].map(sort_string_like_this)
# 按辅助列升序,再按number列自然升序排序
sorted_df = df.sort_values(['sort_key', 'number']).drop('sort_key', axis=1)
print(sorted_df)

方法2:针对列指定不同key(pandas 1.1.0+支持)

直接在sort_values的key参数里传字典,为每列单独指定排序处理逻辑:

import pandas
import numpy

strs = ['custom','sort']*5
df = pandas.DataFrame(
    {
        'string': strs,
        'number': numpy.random.randn(len(strs)),
    }
)

sort_string_like_this = {'sort': 0, 'custom': 1}
# string列用自定义字典映射排序,number列保持原数值顺序
sorted_df = df.sort_values(
    by=['string', 'number'],
    key={'string': lambda x: x.map(sort_string_like_this), 'number': lambda x: x}
)
print(sorted_df)

两种方法最终都会输出符合预期的结果:string列按sort在前、custom在后的顺序排列,同一string分组内的number列从小到大自然排序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 22:40:58