【问题标题】:Dask Dataframe Effecient Row Pair Generator?Dask Dataframe 高效行对生成器?
【发布时间】:2020-07-10 17:24:05
【问题描述】:

在输入输出方面我真正想要实现的是交叉连接

输入示例

df = pd.DataFrame(columns = ['A', 'val'], data = [['a1', 23],['a2', 29], ['a3', 39]])
print(df)
    A  val
0  a1   23
1  a2   29
2  a3   39

输出示例:

df['key'] = 1
df.merge(df, how = "outer", on ="key")
  A_x  val_x  key A_y  val_y
0  a1     23    1  a1     23
1  a1     23    1  a2     29
2  a1     23    1  a3     39
3  a2     29    1  a1     23
4  a2     29    1  a2     29
5  a2     29    1  a3     39
6  a3     39    1  a1     23
7  a3     39    1  a2     29
8  a3     39    1  a3     39

如何使用 Dask 为大型数据集实现这一点?

我有兴趣获取 Dask 数据帧(类似于笛卡尔积)的所有行对组合,以进一步计算行间指标,例如距离等。但是在本地使用 Dask Distributed 时,我总是遇到内存错误,我提供了一个玩具我正在努力实现的示例。

我是 dask 的新手,所以我只想知道这在本地是否可行?我理想的分区大小应该是多少?使用 dask 获取行对的更好方法是什么?

import pandas as pd
import numpy as np
import dask.dataframe as dd
from dask.distributed import Client
client = Client()
client
df = pd.DataFrame(columns = list(range(50)), data =  np.random.rand(10000,50))
ddf = dd.from_pandas(df, npartitions=10)  # rather than here
ddf = ddf.assign(key = 0)
ddf = dd.merge(ddf, ddf, suffixes=('', '_ch'), on='key', 
npartitions = 10000, how = 'outer')
ddf['0'].mean().compute()

我收到以下错误:

MemoryError: Unable to allocate 37.3 GiB for an 
array with shape (100000000, 50) and data type float64

本地集群详情

Scheduler: tcp://127.0.0.1:52435
Dashboard: http://127.0.0.1:8787/status
Cluster
Workers: 4
Cores: 12
Memory: 34.10 GB

[]

【问题讨论】:

  • 您介意添加您要查找的输出吗?在我看来,这不是一种有效的方法。
  • @rpanai 编辑了示例输入输出的问题
  • 每个块和使用多个块的每个函数都需要适应内存。尝试减少工作人员的数量(增加每个工作人员的可用内存)并尝试增加块的数量。

标签: python pandas dask dask-distributed


【解决方案1】:

一个完整的外部产品可能会生成一个非常大的数据集。假设您的每个中间熊猫数据框只有一百万行。该数据帧与自身的叉积将容纳一万亿行,因此可能会耗尽该机器上的内存。

我怀疑您实际上想做其他事情,而这是朝着这个方向迈出的一步。我建议尝试找到另一条通往您想要的道路。例如,如果你想要关联,不妨试试corr 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多