为什么Pyarrow可以读取额外的索引列,而Pandas dataframe不能?

tkclm6bt  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(142)

下面的代码:

import pandas as pd
import dask.dataframe as da
from pyarrow.parquet import ParquetFile

df = pd.DataFrame([1, 2, 3], columns=["value"])

my_dataset = da.from_pandas(df, chunksize=3)
save_dir = './local/'
my_dataset.to_parquet(save_dir)

pa = ParquetFile("./local/part.0.parquet")
print(pa.schema.names)

df2 = pd.read_parquet("./local/part.0.parquet")
print(df2.columns)

输出为:

['value', '__null_dask_index__']
Index(['value'], dtype='object')

只是好奇,为什么Pandas dataframe忽略了__null_dask_index__列名?或者__null_dask_index__不被认为是一个列?

jgzswidk

jgzswidk1#

pandas将读取__null_dask_index__并将其(正确地)用作索引,因此它不会显示在列列表中。要清楚地看到这一点,请指定一个自定义索引(例如4,5,6),然后检查df2 Dataframe 的头部:

from pandas import DataFrame
from dask.dataframe import from_pandas
from pyarrow.parquet import ParquetFile

df = DataFrame([1, 2, 3], columns=["value"], index=[4,5,6])

my_dataset = from_pandas(df, chunksize=2)
save_dir = './local/'
my_dataset.to_parquet(save_dir)

pa = ParquetFile("./local/part.0.parquet")
print(pa.schema.names)

from pandas import read_parquet
df2 = read_parquet("./local/part.0.parquet")
print(df2.head())
#                      value
# __null_dask_index__       
# 4                        1
# 5                        2

由dask和panda创建的parquet文件(通过arrow或fastparquet)包含一个特殊的元数据区域,用于指定panda/dask使用的列和索引属性,但是arrow本身并不知道这个区域。

相关问题