如何将dask系列保存到hdf5

时间:2018-08-08 17:19:27

标签: python hdf5 dask

这是我首先尝试的

df = dd.from_pandas(pd.DataFrame(dict(x=np.random.normal(size=100), 
y = np.random.normal(size=100))), chunksize=40)

cat = df.map_partitions( lambda d: np.digitize(d['x']+d['y'], [.3,.9]), meta=pd.Series([], dtype=int, name='x'))
cat.to_hdf('/tmp/cat.h5', '/cat')

此操作失败,显示cannot properly create the storer...

我接下来尝试保存cat.values:

da.to_hdf5('/tmp/cat.h5', '/cat', cat.values)

这以cannot convert float NaN to integer失败,我猜测是由于cat.values没有nan形状和块大小值。

我如何使这两个都起作用?请注意,实际数据无法容纳在内存中。

1 个答案:

答案 0 :(得分:0)

这很好:

import numpy as np
import pandas as pd
import dask.dataframe as dd

df = pd.DataFrame(dict(x=np.random.normal(size=100),
                       y=np.random.normal(size=100)))
ddf = dd.from_pandas(df, chunksize=40)

cat = ddf.map_partitions(lambda d: pd.Series(np.digitize(d['x'] + d['y'], [.3,.9])),
                         meta=('x', int))
cat.to_hdf('cat.h5', '/cat')

您缺少对pd.Series的调用周围的np.digitize包装器,这意味着map_partitions的输出是一个numpy数组而不是pandas系列(错误)。将来在进行调试时,尝试从步骤中逐步计算出一些数据以查看错误的位置可能很有用(例如,我通过在.head()上运行cat发现了此问题)。