Dask 数据框 - 包含 numpy 数组的列 - 转换为 parquet 错误

问题描述 投票:0回答:1

我有一个 dask 数据框,我正在尝试将其转换为镶木地板文件。该数据框的列是 numpy 数组,但列类型是“对象”。

当我尝试这样做时:

name_function = lambda x: f"data-{x}.parquet"
data_frame[['numpy_array_col1','numpy_array_col2']].to_parquet('train/',name_function=name_function)

我收到此错误:

ArrowTypeError: ("Expected bytes, got a 'numpy.ndarray' object", 'Conversion failed for column INPUT with type object')

During handling of the above exception, another exception occurred:

# Other errors

Can only convert 1-dimensional array values

我尝试使用 csv 并且它有效,但我知道最好使用 parquet 文件,并且我不知道读取 csv 是否会由于列类型的模糊性而引发逻辑或语法错误。

data_frame[['numpy_array_col1','numpy_array_col2']].to_csv('train/train-*.csv')

更新:读取 csv 文件时,numpy 数组变为字符串类型,因此我必须将它们转换回 numpy 数组。

我也尝试过

df.to_parquet('somefile', engine='pyarrow')

同样的事情发生

python csv dask parquet pyarrow
1个回答
0
投票

我尝试过这个解决方法。首先,展平 dask 数据框中的所有 numpy 数组。然后写入 parquet 文件,指定具有 pyArrow 列表数据类型的架构。最后你可以读取该文件,但你必须将之前的所有数组重新调整为原始形状。

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

a = np.array([[5, 6], [7, 8]]).flatten()
b = np.array([[9, 10], [11, 12]]).flatten()
df = pd.DataFrame({"col1": [a],"col2":[b]})
df.loc[1] = (b,a)

df = dd.from_pandas(df, npartitions=2)

print(df.compute())

name_function = lambda x: f"data-{x}.parquet"
df[['col1','col2']].to_parquet('train/',name_function=name_function,engine='pyarrow',schema={"col1": pa.list_(pa.int32()),"col2": pa.list_(pa.int32())})


df2 = dd.read_parquet(['train/data-0.parquet','train/data-1.parquet'])  
print(df2.compute())

def reshape(x):
    if(x == 'foo'):
        return x
    return x.reshape(2,2) 

df2 = df2.applymap(lambda x:reshape(x)) 
print(df2.compute())
              col1             col2
0     [5, 6, 7, 8]  [9, 10, 11, 12]
1  [9, 10, 11, 12]     [5, 6, 7, 8]
              col1             col2
0     [5, 6, 7, 8]  [9, 10, 11, 12]
1  [9, 10, 11, 12]     [5, 6, 7, 8]
                  col1                 col2
0     [[5, 6], [7, 8]]  [[9, 10], [11, 12]]
1  [[9, 10], [11, 12]]     [[5, 6], [7, 8]]

我希望有另一个更简单的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.