我有一个 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')
同样的事情发生
我尝试过这个解决方法。首先,展平 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]]
我希望有另一个更简单的解决方案。