如何让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




