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

如何按含字母数字的day列正确排序DataFrame?

解决DataFrame中day列的排序问题

你的猜测完全正确!问题出在day列是字符串类型,默认排序会采用字典序(逐个字符比较),所以day11会排在day2前面——毕竟字符串里day之后的第一个字符1比2小,排序逻辑就直接判定day11更小了。

下面给你几种实用的解决方法,按从简洁到直观的顺序排列:

方法1:用key参数直接提取数字排序(推荐)

不用额外创建临时列,直接在sort_values里通过key指定排序依据:

import pandas as pd

# 假设你的DataFrame是df
df_sorted = df.sort_values(
    by='day',
    key=lambda col: col.str.extract('(\d+)').astype(int)  # 提取day里的数字并转成整数
)

这里str.extract('(\d+)')会从每个day字符串里提取连续的数字部分,比如day11提取出11,day2提取出2,转成整数后就能按数值大小排序了。

方法2:创建临时数字列辅助排序

如果你需要保留提取出的数字列做其他分析,可以先新增一列,再排序:

# 提取数字并转成整数列
df['day_number'] = df['day'].str.extract('(\d+)').astype(int)
# 按数字列排序,之后可选择删除临时列
df_sorted = df.sort_values('day_number').drop('day_number', axis=1)

方法3:去掉前缀后转整数排序

如果你的day列格式固定是day+数字(没有其他杂字符),也可以直接去掉前缀再转整数:

df_sorted = df.sort_values(
    by='day',
    key=lambda col: col.str.lstrip('day').astype(int)
)

额外优化:重置排序后的索引

排序后原索引会保留,如果你想要连续的新索引,可以加上reset_index:

df_sorted = df.sort_values(
    by='day',
    key=lambda col: col.str.extract('(\d+)').astype(int)
).reset_index(drop=True)

用你给出的示例数据测试,排序后的day列会变成:day0 → day2 → day8 → day11 → day15,整行数据也会跟着正确排序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:46:00