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

Dask仅支持单列排序,如何实现按整数、日期两列先后排序?

Dask多字段排序解决方案

方案1:无需创建合并列(推荐)

2021.06.0及以上版本的Dask已经原生支持多列排序,无需额外构造字段,直接调用sort_values接口即可实现需求:

  1. 先升级Dask到最新稳定版:
    pip install -U dask
  2. 直接按多字段排序,示例代码如下:
import dask.dataframe as dd

# 读取你的大文件,根据实际情况调整读取参数
df = dd.read_csv("your_file_path.csv", parse_dates=["date_col"])

# by参数传入排序字段列表,ascending传入对应字段的排序方向
# 示例为先按整数字段降序、再按日期字段升序,和你给出的排序效果匹配
df_sorted = df.sort_values(by=["int_col", "date_col"], ascending=[False, True])

# 输出结果
df_sorted.to_csv("sorted_output/*.csv", index=False)

方案2:构造合并排序列(适配旧版本Dask)

如果受环境限制无法升级Dask,可以按照以下逻辑构造合并排序键:
排序逻辑是整数字段降序、日期字段升序,所以需要把两个字段的排序规则转化为单个字符串的字典序规则:

  • 整数字段降序:用整数字段的最大值减去当前整数值,将结果转成定长补零字符串,数值越大的整数,对应字符串的字典序越小
  • 日期字段升序:YYYY-MM-DD格式的日期字符串本身字典序和时间顺序一致,直接拼接即可
    示例代码如下:
import dask.dataframe as dd

df = dd.read_csv("your_file_path.csv", parse_dates=["date_col"])

# 计算整数字段的最大值,确定定长字符串需要的长度
max_int = df["int_col"].max().compute()
int_str_len = len(str(max_int))

# 构造合并排序键
df["sort_key"] = (max_int - df["int_col"]).astype(str).str.zfill(int_str_len) + df["date_col"].astype(str)

# 按排序键升序排序,删除临时排序键得到结果
df_sorted = df.sort_values(by="sort_key", ascending=True).drop(columns=["sort_key"])

df_sorted.to_csv("sorted_output/*.csv", index=False)

注意事项

如果整数字段存在负值,只需要给所有整数加上一个固定偏移量,将所有值转为非负数后再做定长转换即可,其余逻辑不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:36:03