DASK - AttributeError: 'DataFrame' 对象没有 'sort_values' 属性。

3

我只是想按照特定列对dask dataframe进行排序。

CODE 1 - 如果调用它,确实会显示为ddf

my_ddf

OUTPUT 1

npartitions=1   
headers .....

代码 2

my_ddf.sort_values('id', ascending=False)

输出 2

AttributeError                            Traceback (most recent call last)
<ipython-input-374-35ce4bd06557> in <module>
----> 1 my_ddf.sort_values('id', ascending=False) #.head(20)
      2 # df.sort_values(columns, ascending=True)

~/anaconda3/envs/rapids/lib/python3.7/site-packages/dask/dataframe/core.py in __getattr__(self, key)
   3619             return self[key]
   3620         else:
-> 3621             raise AttributeError("'DataFrame' object has no attribute %r" % key)
   3622 
   3623     def __dir__(self):

AttributeError: 'DataFrame' object has no attribute 'sort_values'

已尝试的解决方案

  • 这是来自官方Dask文档的示例: df.sort_values(columns, ascending=False).head(n)
  • 仅适用于Pandas-DataFrame对象没有'sort_values'属性
  • 仅适用于Pandas-'DataFrame'对象没有'sort'属性
  • DASK答案 - https://dev59.com/-VkS5IYBdhLWcg3wFi-k#40378896
    • 我不想将其设置为索引,因为我只想拥有当前索引值。
    • 以下答案有点奇怪,我不确定当我有更多分区(目前我只有1个,因为数据之前进行了分组)时它是否会起作用,或者如何避免只是一个随机的大数字“1000000000”。或如何使它从上到下逐渐变大在Dask dataframe中 my_ddf.nlargest(1000000000, 'id').compute()
3个回答

3
据我所知,跨分区排序尚未实现(还没有?)。如果数据集足够小,可以使用ddf = ddf.compute()将其计算到内存中,然后在 pandas 数据帧上运行排序。

目前是这样的,但只是因为我正在使用较小的数据集构建流水线。因此,在我将其承受100倍负载时,保持一切都在DASK中仍然至关重要。 - sogu
1
我明白了,当我遇到类似的问题时,我不得不加入额外的逻辑,这是dask不知道的,例如某些值只能出现在特定的分区中,因此不需要进行完整的数据洗牌。最终,我使用了delayed来完成这个任务。 - SultanOrazbayev

2
Dask的索引默认情况下并不是全局的。 如果你想保留原始的分区内索引,可以尝试以下方法:
df["old_index"] = df.reset_index()
df.set_index("colA")

2

尝试将索引设置为 id,然后通过以下方式通过 map_partitions 进行排序:

df = df.set_index("id")
df = df.map_partitions(lambda df: df.sort_values(["id"], ascending=False)).reset_index()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接