dask DataFrame相当于pandas DataFrame sort_values

时间:2016-11-02 09:28:26

标签: python dask

对于dask DataFrame,pandas中的sort_values相当于什么?我正在尝试扩展一些有内存问题的Pandas代码,而不是使用dask DataFrame。

相当于:

ddf.set_index([col1, col2], sorted=True)

3 个答案:

答案 0 :(得分:4)

并行排序很难。 Dask.dataframe

中有两个选项

set_index

与现在一样,您可以使用单个列索引调用set_index:

In [1]: import pandas as pd

In [2]: import dask.dataframe as dd

In [3]: df = pd.DataFrame({'x': [3, 2, 1], 'y': ['a', 'b', 'c']})

In [4]: ddf = dd.from_pandas(df, npartitions=2)

In [5]: ddf.set_index('x').compute()
Out[5]: 
   y
x   
1  c
2  b
3  a

Unfortunately dask.dataframe does not (as of November 2016) support multi-column indexes

In [6]: ddf.set_index(['x', 'y']).compute()
NotImplementedError: Dask dataframe does not yet support multi-indexes.
You tried to index with this index: ['x', 'y']
Indexes must be single columns only.

nlargest

鉴于你如何处理你的问题,我怀疑这不适用于你,但通常使用排序的案例可以通过更便宜的解决方案nlargest来解决。

In [7]: ddf.x.nlargest(2).compute()
Out[7]: 
0    3
1    2
Name: x, dtype: int64

In [8]: ddf.nlargest(2, 'x').compute()
Out[8]: 
   x  y
0  3  a
1  2  b

答案 1 :(得分:2)

您将使用以下代码添加新的复合列并为其设置索引:

newcol = ddf.col1 + "|" + ddf.col2
ddf = ddf.assign(ind=newcol)
ddf = ddf.set_index('ind', sorted=True)

如果数据框按(col1,col2)排序,则它将按newcol排序,因此您可以使用sorted = True。

答案 2 :(得分:0)

我的首选方法是首先使用 dask 中的单个列 set_index,然后使用 sort_values

分发 Pandas 的 map_partitions
# Prepare data
import dask
import dask.dataframe as dd
data = dask.datasets.timeseries()

# Sort by 'name' and 'id'
data = data.set_index('name')
data = data.map_partitions(lambda df: df.sort_values(['name', 'id']))

一个可能的问题是单个索引值不能在多个分区中。但从我在实践中看到的情况来看,Dask 似乎不允许这种情况发生。不过,对此有一个更有根据的意见会很好。