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

如何按多列对Pandas DataFrame排序并指定各列排序方式?

解决Pandas多列排序:id常规排序 + version自然排序

你的问题出在sort_values的key参数被错误地全局应用到了所有排序列上,导致id列的排序规则被忽略,最终结果不符合预期。下面是两种正确实现需求的方法:

方法一:针对不同列指定对应排序Key

利用apply对每个列单独处理:对id列用常规数值排序,对version列用natsort的自然排序索引。

import pandas as pd
from natsort import index_natsorted
import numpy as np

data = {"version":["3.1.1","3.1.10","3.1.2","3.1.3", "4.1.6"], 
        "id":[2,2,2,2,1]}

df = pd.DataFrame(data)

# 正确的多列排序
df_sorted = df.sort_values(
    by=["id", "version"],
    key=lambda x: x.apply(lambda col: index_natsorted(col) if col.name == "version" else col),
    ignore_index=True
)

print(df_sorted)

执行后输出:

versionid
4.1.61
3.1.12
3.1.22
3.1.32
3.1.102

方法二:分组后组内排序

先按id分组并排序,再在每个分组内对version执行自然排序:

df_sorted = df.groupby("id", sort=True).apply(
    lambda group: group.sort_values("version", key=lambda x: index_natsorted(x))
).reset_index(drop=True)

这个方法逻辑更直观,适合需要对不同列应用复杂排序规则的场景。

原代码问题说明

你之前的key函数直接引用了df["version"],这意味着不管当前处理的是id还是version列,排序依据都是version的自然排序索引,完全忽略了id列的排序需求,所以才会出现id=1的行排在最后的错误结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:33:09