Dask仅支持单列排序,如何实现按整数、日期两列先后排序?
Dask多字段排序解决方案
方案1:无需创建合并列(推荐)
2021.06.0及以上版本的Dask已经原生支持多列排序,无需额外构造字段,直接调用sort_values接口即可实现需求:
- 先升级Dask到最新稳定版:
pip install -U dask - 直接按多字段排序,示例代码如下:
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
相关产品推荐
相关产品推荐

