为何PyArrow可读取额外索引列而Pandas DataFrame却无法读取?
问题:Pandas读取Parquet时为何忽略__null_dask_index__列?
代码示例
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__是Dask保存Parquet时自动添加的特殊元数据列,并非普通业务数据列:
- 当你把无自定义索引的Pandas DataFrame转为Dask DataFrame时,Dask会自动生成这个空索引列,用来维持分块计算的逻辑一致性,保存Parquet时会将其写入文件。
- Pandas在读取Parquet时,会自动识别并过滤这类由Dask添加的特殊索引元数据,只加载真正的业务数据列。
- 要是想让Pandas读取到这个列,可以在Dask保存时加上参数
write_index=False(禁止写入索引列),或者通过pyarrow的API手动读取所有列后再转为DataFrame。
内容的提问来源于stack exchange,提问作者noobie2023
相关产品推荐
相关产品推荐

