这是我首先尝试的
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形状和块大小值。
我如何使这两个都起作用?请注意,实际数据无法容纳在内存中。
答案 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
发现了此问题)。