You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让pandas.read_parquet()按照Parquet文件元信息指定的列类型读取数据

如何让pandas.read_parquet()按照Parquet文件元信息指定的列类型读取数据

嗨,这个问题我之前也碰到过,pandas默认处理混合值列的时候确实容易把它归成Object类型,不过咱们可以利用Parquet自带的元信息和pyarrow来解决,给你两个实用的办法:

  • 方法一:先用pyarrow读取schema,再传给pandas指定类型
    你已经知道用pyarrow.parquet.read_schema(path_raw)能拿到文件的原始schema,接下来我们可以把这个schema转换成pandas能识别的dtype字典,然后在读取的时候传给read_parquet()dtype参数。代码示例如下:

    import pyarrow.parquet as pq
    import pandas as pd
    
    # 读取Parquet文件的原始schema
    schema = pq.read_schema("your_target_file.parquet")
    # 把schema转成pandas兼容的dtype字典
    dtype_dict = {field.name: field.type.to_pandas_dtype() for field in schema}
    # 用指定的类型规则读取文件,记得指定pyarrow引擎
    df = pd.read_parquet("your_target_file.parquet", dtype=dtype_dict, engine="pyarrow")
    

    这里一定要指定engine="pyarrow",因为它对Parquet类型的映射更贴合原始元信息,能有效避免类型偏差。

  • 方法二:直接用pyarrow读取后转成DataFrame
    另一种更省心的方式是先用pyarrow把Parquet文件读成Arrow表,再转换成pandas DataFrame,这样会完整保留Parquet元信息里的列类型,完全不用手动处理dtype:

    import pyarrow.parquet as pq
    import pandas as pd
    
    # 用pyarrow读取Parquet文件为Arrow表
    table = pq.read_table("your_target_file.parquet")
    # 转成pandas DataFrame
    df = table.to_pandas()
    

    这个方法尤其适合处理带复杂类型的列(比如嵌套结构、decimal类型),pyarrow对这类特殊类型的支持比pandas原生处理要靠谱得多。

另外要提一句:如果你的Parquet文件里某列确实存在混合类型(比如既有整数又有字符串),那它的元信息里该列的类型本身可能就是兼容多类型的(比如pyarrow的string或binary),这时候pandas可能还是会识别成Object,但这种情况属于文件本身的类型定义问题,不是读取方式的锅哦。

备注:内容来源于stack exchange,提问作者MikeB2019x

火山引擎 最新活动