如何使用pd.read_parquet的filters参数筛选分区Parquet数据?
解决Pandas读取分区Parquet时多OR条件筛选返回空的问题
当你用Pandas读取按Value列分区的Parquet文件时,单条件筛选能正常工作,但多OR条件返回空DataFrame,核心问题是filters参数的格式写错了。
错误写法(导致空DataFrame)
你可能写成了这种形式:
pd.read_parquet("path/to/parquet", filters=[("Value", "=", "A"), ("Value", "=", "B")])
这种写法实际是AND逻辑(要求Value同时等于A和B),自然查不到数据。
正确OR条件写法
Pandas的filters参数中,OR条件需要将每个分支放在单独的子列表里,格式如下:
pd.read_parquet("path/to/parquet", filters=[[("Value", "=", "A")], [("Value", "=", "B")]])
外层列表的每个子列表代表一个OR分支,这样就能正确筛选出Value为A或B的分区数据。
验证示例
先创建测试分区Parquet数据:
import pandas as pd import numpy as np # 生成测试数据 df = pd.DataFrame({ "Value": np.repeat(["A", "B", "C"], 10), "Data": np.random.randn(30) }) # 按Value列分区保存 df.to_parquet("test_parquet", partition_cols=["Value"])
再用正确的OR条件读取:
# 读取Value为A或B的分区 result = pd.read_parquet("test_parquet", filters=[[("Value", "=", "A")], [("Value", "=", "B")]]) print(result["Value"].unique()) # 输出 ['A' 'B']
补充说明
如果需要混合AND和OR条件,比如(Value == "A" AND Data > 0) OR (Value == "B" AND Data < 0),可以这样写:
filters=[ [("Value", "=", "A"), ("Data", ">", 0)], [("Value", "=", "B"), ("Data", "<", 0)] ] pd.read_parquet("test_parquet", filters=filters)
内容的提问来源于stack exchange,提问作者boshek
相关产品推荐
相关产品推荐

