【发布时间】: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