在 Dask 中排序
Sorting in Dask
我想在 dask 中找到 pandas.dataframe.sort_value 函数的替代方法。
我通过了 set_index,但它会在单个列上排序。
如何对 Dask 数据框的多列进行排序?
目前Dask好像不支持多列排序。但是,创建一个连接已排序列的值的新列可能是一种可用的解决方法。
d['new_column'] = d.apply(lambda r: str([r.col1,r.col2]), axis=1)
d = d.set_index('new_column')
d = d.map_partitions(lambda x: x.sort_index())
编辑:
如果你想按两个字符串排序,上面的方法是有效的。我建议创建整数(或字节)列,然后使用 struct.pack
创建一个新的复合字节列。例如,如果 col1_dt
是一个日期时间并且 col2
是一个整数:
import struct
# create a timedelta with seconds resolution.
# i know this is the resolution is correct
d['col1_int'] = ((d['col1_dt'] -
d['col1_dt'].min())/np.timedelta64(1,'s')
).astype(int)
d['new_column'] = d.apply(lambda r: struct.pack("ll",r.col1_int,r.col2))
d = d.set_index('new_column')
d = d.map_partitions(lambda x: x.sort_index())
我想在 dask 中找到 pandas.dataframe.sort_value 函数的替代方法。
我通过了 set_index,但它会在单个列上排序。
如何对 Dask 数据框的多列进行排序?
目前Dask好像不支持多列排序。但是,创建一个连接已排序列的值的新列可能是一种可用的解决方法。
d['new_column'] = d.apply(lambda r: str([r.col1,r.col2]), axis=1)
d = d.set_index('new_column')
d = d.map_partitions(lambda x: x.sort_index())
编辑:
如果你想按两个字符串排序,上面的方法是有效的。我建议创建整数(或字节)列,然后使用 struct.pack
创建一个新的复合字节列。例如,如果 col1_dt
是一个日期时间并且 col2
是一个整数:
import struct
# create a timedelta with seconds resolution.
# i know this is the resolution is correct
d['col1_int'] = ((d['col1_dt'] -
d['col1_dt'].min())/np.timedelta64(1,'s')
).astype(int)
d['new_column'] = d.apply(lambda r: struct.pack("ll",r.col1_int,r.col2))
d = d.set_index('new_column')
d = d.map_partitions(lambda x: x.sort_index())