为何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
相关产品推荐
相关产品推荐

