【问题标题】:Pandas DataFrame with categorical columns from a Parquet file using read_parquet?使用 read_parquet 的 Parquet 文件中带有分类列的 Pandas DataFrame?
【发布时间】:2019-07-10 21:35:27
【问题描述】:

我正在将大型 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 以进行进一步分析时,我似乎无法恢复类别 dtypes。以下

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

导致DataFrame 使用object dtypes 代替所需的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 来完成此操作。

【问题讨论】:

    标签: python-3.x pandas parquet pyarrow


    【解决方案1】:

    这是在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
    

    【讨论】:

    • 这取决于使用的引擎吗? (pyarrowfastparquet
    • 是的,这是 pyarrow 的,不确定 fastparquet
    • 对于 100mb 的 csv 文件,您知道是否值得切换到镶木地板?
    • @Topde 当然,切换到镶木地板不仅可以提高速度,还可以保留列类型和数据结构。 Parquet 文件可以存储多索引、列类型(尤其是分类和日期时间),这对于在 CSV 上使用 parquet 来保证数据的正确性(以及速度)是有意义的。
    【解决方案2】:

    我们遇到了类似的问题。 使用多文件镶木地板时,解决方法如下: 使用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]

    【讨论】:

    • 对于 100mb 的 csv 文件,您知道是否值得切换到镶木地板?
    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 2019-02-15
    • 2020-05-13
    • 2016-02-22
    • 2017-11-03
    • 2021-06-13
    • 2016-07-02
    • 2021-06-14
    相关资源
    最近更新 更多