加载Parquet文件时,如何用单个过滤器移除1900年出生且未离世的记录?
简化Parquet读取过滤器:移除1900年出生且未去世的记录
需求:移除数据中**1900年出生且death字段为None(尚未去世)**的记录,原本通过两组过滤器实现,现需简化为单个过滤器逻辑。
原实现代码:
import pandas as pd data = [ (1900, None,), # 需要移除的记录 (1900, 2000,), (2000, None,), (2000, 2020,), ] df = pd.DataFrame(data, columns=['birth', 'death']) df.to_parquet('test.parquet') # 原过滤器:两组条件,满足任意一组则保留 filters= [ [ ('birth', '!=', 1900), ], [ ('birth', '=', 1900), ('death', 'not in', [None]), ] ] df2 = pd.read_parquet('test.parquet', filters=filters) print(df2)
简化后的单个过滤器方案
方案一:正向组合逻辑
将需求转化为**「出生年份不等于1900,或者(出生年份等于1900且去世年份不为空)」**,用嵌套逻辑组合实现:
import pandas as pd # 简化后的单个过滤器 filters = [ [ ('birth', '!=', 1900), ('or', [('birth', '=', 1900), ('death', 'is not', None)]) ] ] df2 = pd.read_parquet('test.parquet', filters=filters) print(df2)
方案二:反向排除逻辑
直接针对需要移除的记录写反向条件:「不满足(出生年份等于1900且去世年份为空)」,写法更贴合需求描述:
import pandas as pd filters = [ [ ('not', [('birth', '=', 1900), ('death', 'is', None)]) ] ] df2 = pd.read_parquet('test.parquet', filters=filters) print(df2)
逻辑说明
两种方案均等价于原两组过滤器的效果:
- 方案一通过
or组合正向保留的条件,覆盖所有符合要求的记录 - 方案二通过
not直接排除需要移除的目标记录,逻辑更直观
内容的提问来源于stack exchange,提问作者3UqU57GnaX
相关产品推荐
相关产品推荐

