使用read_parquet从Parquet文件中带有分类列的Pandas DataFrame?

时间:2019-02-17 08:23:10

标签: python-3.x pandas parquet pyarrow

我正在将大型CSV文件转换为Parquet文件以进行进一步分析。我将CSV数据读入Pandas,并按如下所示指定列dtypes

_dtype = {"column_1": "float64",
          "column_2": "category",
          "column_3": "int64",
          "column_4": "int64"}

df = pd.read_csv("data.csv", dtype=_dtype)

然后我再进行一些数据清理,并将数据写到Parquet中供下游使用。

_parquet_kwargs = {"engine": "pyarrow",
                   "compression": "snappy",
                   "index": False}

df.to_parquet("data.parquet", **_parquet_kwargs)

但是,当我使用from_parquet将数据读入Pandas进行进一步分析时,我似乎无法恢复类别dtype。以下

df = pd.read_parquet("data.parquet")

使用DataFrame dtypes代替所需的object产生category

以下内容似乎可以正常工作

import pyarrow.parquet as pq

_table = (pq.ParquetFile("data.parquet")
            .read(use_pandas_metadata=True))

df = _table.to_pandas(strings_to_categorical=True)

但是我想知道如何使用pd.read_parquet完成此操作。

2 个答案:

答案 0 :(得分:1)

我们遇到了类似的问题。 使用多文件拼花地板时,解决方法如下: 使用Table.to_pandas() documentation,以下代码可能是相关的:

import pyarrow.parquet as pq
dft = pq.read_table('path/to/data_parquet/', use_pandas_metadata=True)
df = dft.to_pandas(categories=['column_2'] )

use_panadas_metadata适用于dtype datetime64[ns]

答案 1 :(得分:0)

此问题已在Arrow 0.15中修复,现在,下一个代码将列保留为类别(并且性能显着提高):

import pandas

df = pandas.DataFrame({'foo': list('aabbcc'),
                       'bar': list('xxxyyy')}).astype('category')

df.to_parquet('my_file.parquet')
df = pandas.read_parquet('my_file.parquet')
df.dtypes