从 parquet 加载 pandas DataFrame - 列表被反序列化为 numpy 的 ndarrays
Loading pandas DataFrame from parquet - lists are deserialized as numpy's ndarrays
import pandas as pd
df = pd.DataFrame({
"col1" : ["a", "b", "c"],
"col2" : [[1,2,3], [4,5,6,7], [8,9,10,11,12]]
})
df.to_parquet("./df_as_pq.parquet")
df = pd.read_parquet("./df_as_pq.parquet")
[type(val) for val in df["col2"].tolist()]
输出:
[<class 'numpy.ndarray'>, <class 'numpy.ndarray'>, <class 'numpy.ndarray'>]
有什么方法可以读取 parquet 文件并将列表值作为 pythonic 列表(就像在创建时一样)?
最好使用 pandas
但愿意尝试替代方案。
我面临的问题是我事先不知道哪些列包含列表,因此我检查类型的方式与我在代码中所做的类似。假设我目前对将 numpy 添加为依赖项不感兴趣,是否有任何方法可以在不显式导入和指定 np.ndarray
?
的情况下检查变量是否类似于数组
您无法在 API 中更改此行为,无论是 loading the parquet file into an arrow table or converting the arrow table to pandas。
但是您可以编写自己的函数来查看箭头的架构 table 并将每个 list
字段转换为 python 列表
import pyarrow as pa
import pyarrow.parquet as pq
def load_as_list(file):
table = pq.read_table(file)
df = table.to_pandas()
for field in table.schema:
if pa.types.is_list(field.type):
df[field.name] = df[field.name].apply(list)
return df
load_as_list("./df_as_pq.parquet")
是的,用engine='fastparquet'
阅读:
import pandas as pd
df = pd.DataFrame({
"col1" : ["a", "b", "c"],
"col2" : [[1,2,3], [4,5,6,7], [8,9,10,11,12]]
})
df.to_parquet("./df_as_pq.parquet")
df = pd.read_parquet("./df_as_pq.parquet", engine='fastparquet')
[type(val) for val in df["col2"].tolist()]
会输出[list, list, list]
import pandas as pd
df = pd.DataFrame({
"col1" : ["a", "b", "c"],
"col2" : [[1,2,3], [4,5,6,7], [8,9,10,11,12]]
})
df.to_parquet("./df_as_pq.parquet")
df = pd.read_parquet("./df_as_pq.parquet")
[type(val) for val in df["col2"].tolist()]
输出:
[<class 'numpy.ndarray'>, <class 'numpy.ndarray'>, <class 'numpy.ndarray'>]
有什么方法可以读取 parquet 文件并将列表值作为 pythonic 列表(就像在创建时一样)?
最好使用 pandas
但愿意尝试替代方案。
我面临的问题是我事先不知道哪些列包含列表,因此我检查类型的方式与我在代码中所做的类似。假设我目前对将 numpy 添加为依赖项不感兴趣,是否有任何方法可以在不显式导入和指定 np.ndarray
?
您无法在 API 中更改此行为,无论是 loading the parquet file into an arrow table or converting the arrow table to pandas。
但是您可以编写自己的函数来查看箭头的架构 table 并将每个 list
字段转换为 python 列表
import pyarrow as pa
import pyarrow.parquet as pq
def load_as_list(file):
table = pq.read_table(file)
df = table.to_pandas()
for field in table.schema:
if pa.types.is_list(field.type):
df[field.name] = df[field.name].apply(list)
return df
load_as_list("./df_as_pq.parquet")
是的,用engine='fastparquet'
阅读:
import pandas as pd
df = pd.DataFrame({
"col1" : ["a", "b", "c"],
"col2" : [[1,2,3], [4,5,6,7], [8,9,10,11,12]]
})
df.to_parquet("./df_as_pq.parquet")
df = pd.read_parquet("./df_as_pq.parquet", engine='fastparquet')
[type(val) for val in df["col2"].tolist()]
会输出[list, list, list]