当DataFrame排序列存在重复值时,其排序逻辑是怎样的?
pandas单一重复列排序时的顺序规则
问题场景
我在处理股票数据DataFrame时,执行以下逻辑:按timestamp列排序,再按date分组取每组前40条数据:
df_hourly.reset_index(inplace=True) df_hourly['date'] = df_hourly['timestamp'].dt.date df_hourly.drop_duplicates(subset=['date', 'symbol'], keep='first', inplace=True) df_hourly = df_hourly.sort_values(by = ['timestamp'], ascending = [True]).groupby('date').head(40) df_hourly.reset_index(inplace=True, drop=True)
由于timestamp列存在大量重复值(如示例中多条行的timestamp均为2022-10-03 09:00:00-04:00),多次运行后分组选取的前40条结果有时稳定、有时变化。虽然通过添加第二排序列(如close,代码如下)可以强制固定顺序,但想明确仅按单一重复列排序时,DataFrame是如何确定重复值顺序的。
df_hourly = df_hourly.sort_values(by = ['timestamp', 'close'], ascending = [True, False]).groupby('date').head(40)
核心规则
- pandas的
sort_values()默认使用quicksort(快速排序)算法,这种算法属于不稳定排序:值相等的元素,排序后的相对位置无法保证与原DataFrame一致,且可能在多次运行中出现随机波动——这是因为快速排序的分区逻辑受底层内存分布、数据块存储等因素影响,重复值的排序顺序没有强制约束。 - 如果需要让重复值保留原DataFrame中的相对顺序,可以在
sort_values()中指定kind='stable'参数,此时会使用稳定排序算法(如mergesort),重复值的顺序将固定不变。 - 添加第二排序列能固定结果的原因:此时排序键是多列组合,重复概率极低,排序顺序完全由列值决定,不受排序算法稳定性的影响。
内容的提问来源于stack exchange,提问作者bnye
相关产品推荐
相关产品推荐

