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

为何Pandas中DataFrame.sort_values与Series.sort_values输出排序不同?

Pandas中两种value_counts()调用的平局排序差异解析

问题重现

先看实际代码运行的差异:

import pandas as pd
df = pd.read_csv('https://gist.githubusercontent.com/matthew-brett/806a356bb7b71f08c5c6d0c5235e2f3d/raw/facb1aab243a33033b46657378f65dcd41542596/business.csv')

# Series的value_counts
df['name'].value_counts().head(6)
# 输出:
# name
# Peet's Coffee & Tea    20
# Starbucks Coffee       13
# McDonald's             10
# Jamba Juice            10
# STARBUCKS               9
# Proper Food             9
# Name: count, dtype: int64

# DataFrame的value_counts
df.value_counts('name').head(6)
# 输出:
# name
# Peet's Coffee & Tea    20
# Starbucks Coffee       13
# McDonald's             10
# Jamba Juice            10
# Proper Food             9
# STARBUCKS               9
# Name: count, dtype: int64

可以看到,计数均为9的STARBUCKS和Proper Food在两个结果中的顺序相反,而两者默认排序方法都是不稳定的快速排序(quicksort)。

差异原因

核心在于两个value_counts()方法的底层实现逻辑不同:

  • Series.value_counts()直接对单列数据统计,遍历和分组顺序严格遵循原Series中元素的出现顺序;
  • DataFrame.value_counts('name')基于DataFrame的分组聚合逻辑,处理分组时的内部遍历、哈希表构建顺序和Series版本存在细微差异,导致相同计数的元素在进入排序步骤前,原始先后顺序就不一样。

而quicksort作为不稳定排序,当排序键(此处为计数值)相同时,不会保留元素的原始顺序,而是根据排序过程的分区结果输出顺序。两种不同的前置处理逻辑,最终导致了平局时的排序差异。

解决办法

如果需要稳定的排序结果,确保相同计数的元素顺序一致,可以指定稳定排序算法:

# Series版本指定稳定排序
df['name'].value_counts(kind='stable').head(6)

# DataFrame版本指定稳定排序
df.value_counts('name', kind='stable').head(6)

此时相同计数的元素会保留它们在原始数据中首次出现的顺序,两种调用方式的结果就会一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:55:18