🚀 AI 一键生成 joinquant 策略代码

为什么在 JoinQuant 中使用 sort_values 排序有时不按顺序?

joinquant | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

为何sort_values函数排序,数据有时不是按顺序排列?

同一个程序
为何sort_values函数排序
数据有时不是按顺序排列,有时是对的。
是聚宽数据库原因么?

解决方案

您好!出现 sort_values 排序结果有时不按预期排列的情况,通常不是聚宽数据库的原因,而是 Python 中 pandas 库在处理特定数据时的常见现象。

sort_valuespandas.DataFrame 的内置方法,其排序逻辑是非常严谨的。如果您发现排序结果“不对”或“不稳定”,通常是由以下几个原因导致的:

1. 数据类型(Dtype)问题(最常见)

如果您的数据列被 pandas 识别为字符串(String/Object)而不是数值(Float/Int),排序就会按照“字典顺序”进行,而不是数学大小。

  • 错误示例'10', '100', '2', '30' (按字符串排序,'100' 会排在 '2' 前面)。
  • 解决方法:在排序前,强制将该列转换为数值类型。
# 将目标列转换为浮点数后再排序
df['target_column'] = df['target_column'].astype(float)
df = df.sort_values(by='target_column', ascending=True)

2. 存在缺失值(NaN)

在聚宽获取的财务数据或行情数据中,经常会包含 NaN(缺失值)。默认情况下,sort_values 会将所有的 NaN 值放到排序结果的最后面(无论升序还是降序)。

  • 现象:您可能看到前面排得好好的,突然末尾出现一堆看起来无序的行,其实它们的值是 NaN
  • 解决方法:可以通过 na_position 参数控制,或者在排序前先处理掉缺失值。
# 将 NaN 放在最前面
df = df.sort_values(by='target_column', na_position='first')

# 或者先剔除 NaN 值再排序
df = df.dropna(subset=['target_column']).sort_values(by='target_column')

3. 没有保存排序后的结果(inplace 参数)

sort_values 默认会返回一个新的 DataFrame,而不会修改原数据。如果您没有将结果重新赋值,原数据依然是无序的。

  • 错误示例
df.sort_values(by='target_column') 
print(df) # 此时 df 依然是没有排序的
  • 解决方法:重新赋值,或者使用 inplace=True
# 方法一:重新赋值
df = df.sort_values(by='target_column')

# 方法二:使用 inplace
df.sort_values(by='target_column', inplace=True)

4. 存在相同的值(排序稳定性)

如果您排序的列中存在大量相同的值,那么这些相同值所在的行,其相对顺序可能会因为底层数据的初始状态不同而发生变化。

  • 解决方法:传入多个列名进行多级排序,确保排序的唯一性。
# 先按 column1 排序,如果 column1 相同,再按 column2 排序
df = df.sort_values(by=['column1', 'column2'], ascending=[True, False])

总结排查步骤:

  1. 打印出该列的数据类型:print(df['您的列名'].dtype),确认是否为 float64int64
  2. 检查数据中是否包含 NaNprint(df['您的列名'].isnull().sum())
  3. 检查代码中是否正确接收了排序后的返回值。

只要排除了以上几点,pandas 的排序结果绝对是稳定且准确的,与聚宽底层的数据库无关。建议您在策略中打印出排序前后的 df.head(20)df.tail(20) 进行对比排查具体原因。