如何按多列对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)
执行后输出:
| version | id |
|---|---|
| 4.1.6 | 1 |
| 3.1.1 | 2 |
| 3.1.2 | 2 |
| 3.1.3 | 2 |
| 3.1.10 | 2 |
方法二:分组后组内排序
先按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
相关产品推荐
相关产品推荐

