【问题标题】:dask DataFrame equivalent of pandas DataFrame sort_valuesdask DataFrame 等效于 pandas DataFrame sort_values
【发布时间】:2016-11-02 09:28:25
【问题描述】:

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

相当于:

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

?

【问题讨论】:

    标签: python dataframe sorting dask


    【解决方案1】:

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

    # 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 似乎不允许这种情况发生。不过,对此有更有根据的意见会很好。

    编辑:我在Dask dataframe: Can a single index be in multiple partitions? 中询问过这个问题

    【讨论】:

      【解决方案2】:

      并行排序很难。 Dask.dataframe 中有两个选项

      设置索引

      现在,您可以使用 single 列索引调用 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 解决。

      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
      

      【讨论】:

      • 谢谢马修。如果我提前知道数据帧的行数,那么nlargest 会正常工作吗?
      • nlargest 返回单个分区的 dask.dataframe,因此通常不是排序的好方法。
      • 所以,对所有分区进行排序操作并获得最终结果。哪种方式好?
      【解决方案3】:

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

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

      如果数据框已经按 (col1, col2) 排序,那么它也已经按 newcol 排序,因此您可以使用 sorted=True。

      【讨论】:

      • 我不相信这行得通 — sorted=True 表示您承诺 Dask 索引已排序,而不是您请求 Dask 对其进行排序。见github.com/dask/dask/issues/2388
      • 我已经修正了解释,不清楚。谢谢。
      猜你喜欢
      • 2016-09-26
      • 2023-03-07
      • 2021-05-01
      • 1970-01-01
      • 2021-02-05
      • 2021-11-12
      • 2018-03-30
      • 1970-01-01
      • 2016-04-02
      相关资源
      最近更新 更多