如何让pd.read_parquet的columns参数支持不区分大小写的列过滤?
实现Parquet文件不区分大小写的列过滤
由于pd.read_parquet的columns参数仅接受列名列表,不支持可调用对象,我们可以通过先读取文件元数据获取列名,再做大小写匹配的方式实现需求,全程无需加载全量数据:
方法1:使用PyArrow引擎(Pandas默认引擎)
import pandas as pd import pyarrow.parquet as pq # 定义你需要的目标列(统一转小写) target_cols = {"user_id", "order_date", "total_amount"} # 读取Parquet文件的元数据,提取所有列名 parquet_meta = pq.ParquetFile("your_data.parquet") all_file_cols = [col.name for col in parquet_meta.schema] # 匹配不区分大小写的列:将文件列名转小写后和目标列对比 matching_cols = [col for col in all_file_cols if col.lower() in target_cols] # 读取指定列 df = pd.read_parquet("your_data.parquet", columns=matching_cols)
方法2:使用FastParquet引擎
如果项目中用的是fastparquet作为读取引擎,代码逻辑类似:
import pandas as pd from fastparquet import ParquetFile target_cols = {"user_id", "order_date", "total_amount"} # 获取文件列名 pf = ParquetFile("your_data.parquet") all_file_cols = pf.columns # 匹配列 matching_cols = [col for col in all_file_cols if col.lower() in target_cols] # 读取数据 df = pd.read_parquet("your_data.parquet", columns=matching_cols, engine="fastparquet")
批量处理多文件
如果要处理一批Parquet文件,可以循环遍历每个文件,重复上述逻辑读取后再合并:
import os import pandas as pd import pyarrow.parquet as pq target_cols = {"user_id", "order_date", "total_amount"} data_dir = "path/to/parquet_files" dfs = [] for file in os.listdir(data_dir): if file.endswith(".parquet"): file_path = os.path.join(data_dir, file) # 获取列名并匹配 parquet_meta = pq.ParquetFile(file_path) all_file_cols = [col.name for col in parquet_meta.schema] matching_cols = [col for col in all_file_cols if col.lower() in target_cols] # 读取数据 df = pd.read_parquet(file_path, columns=matching_cols) dfs.append(df) # 合并所有数据 final_df = pd.concat(dfs, ignore_index=True)
内容的提问来源于stack exchange,提问作者Ramon Griffo
相关产品推荐
相关产品推荐

