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

如何让带下划线的大写列值在DataFrame排序时前置?

解决DataFrame带下划线前缀大写字符串的排序问题

默认排序不符合预期的核心原因是ASCII编码规则:下划线_的字符码值是95,而大写字母A-Z的码值范围是65-90,所以下划线开头的大写字符串会被排在所有大写字母之后;而小写字母a-z的码值是97-122,比下划线大,所以下划线开头的小写字符串会排在小写字母之前,这就是你看到大小写排序结果差异的原因。

不需要转小写排序再转回大写,有两种更简便的处理方式:

方法一:使用sort_values的key参数(推荐)

从Pandas 1.1.0版本开始,sort_values支持key参数,可以指定排序的依据函数,且不会修改原数据内容。直接基于字符串的小写形式排序,原数据保持大写格式:

import pandas as pd

df = pd.DataFrame({
   "cl1": ["foo", "foo", "foo"], 
   "cl2": ["_FOO", "BAR", "BAZ"]
})

# 基于小写字符串排序,原列值保留大写
sorted_df = df.sort_values(["cl1", "cl2"], key=lambda col: col.str.lower())
print(sorted_df)

输出结果:

cl1    cl2
0  foo  _FOO
1  foo   BAR
2  foo   BAZ

如果觉得lambda不够简洁,也可以直接传入pd.Series.str.lower作为key:

sorted_df = df.sort_values(["cl1", "cl2"], key=pd.Series.str.lower)

方法二:自定义排序映射(兼容旧版Pandas)

如果使用的是Pandas 1.1.0之前的版本,可以创建临时排序映射列,基于该列排序后再删除:

# 添加临时排序依据列
df["sort_key"] = df["cl2"].str.lower()
# 基于临时列排序后删除该列
sorted_df = df.sort_values(["cl1", "sort_key"]).drop("sort_key", axis=1)

这种方式兼容性更好,但比key参数多了列操作步骤,不如前者简便。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:05:30