我有一个包含类别元数据的镶木地板文件。我想使用极地中的 scan_parquet 扫描此镶木地板文件,如下所示:
filtered_df = (
pl.scan_parquet(parquet_file)
.filter(pl.col("CATEGORIES").str.contains("people", literal=True) | pl.col("CATEGORIES").str.contains("nature", literal=True) | pl.col("CATEGORIES").str.contains("urban", literal=True)) | ....
.filter(pl.col("MAX_WIDTH") >= HORIZONTAL_RES)
.filter(pl.col("MAX_HEIGHT") >= VERTICAL_RES)
.collect()
)
我有一个类别列表
['nature, 'people,'urban', ..... 'n_categories]
如何我在该扫描镶木地板中编写过滤条件以检查每个类别,如上面的示例所示。该列表并不总是固定的,因为它取决于用户输入。
我没有尝试任何操作,因为我不知道如何用迭代类别列表的 for 循环替换这一行。
.filter(pl.col("CATEGORIES").str.contains("people", literal=True) | pl.col("CATEGORIES").str.contains("nature", literal=True) | pl.col("CATEGORIES").str.contains("urban", literal=True))
可以使用循环和
reduce
函数动态构建过滤器表达式,以扫描包含关键字列表的镶木地板。
import polars as pl
from functools import reduce
def filter_by_categories(parquet_file, categories):
"""
使用类别列表过滤镶木地板文件。
Args:
parquet_file: 镶木地板文件的路径。
categories: 要过滤的类别列表。
Returns:
过滤后的 polars DataFrame。
"""
# 使用列表推导创建一个过滤器表达式的列表
filters = [pl.col("CATEGORIES").str.contains(category, literal=True) for category in categories]
# 使用 reduce 函数将所有过滤器表达式与 OR 运算符组合
combined_filter = reduce(lambda a, b: a | b, filters)
# 使用 Polars 扫描镶木地板文件并应用过滤器
filtered_df = (
pl.scan_parquet(parquet_file)
.filter(combined_filter)
.filter(pl.col("MAX_WIDTH") >= HORIZONTAL_RES)
.filter(pl.col("MAX_HEIGHT") >= VERTICAL_RES)
.collect()
)
return filtered_df
# 示例用法
categories = ['nature', 'people', 'urban']
parquet_file = 'path/to/your/file.parquet'
filtered_df = filter_by_categories(parquet_file, categories)
print(filtered_df)
此代码的工作原理:
-
创建一个过滤器表达式列表:
它使用列表推导来遍历
categories
列表,并为每个类别创建一个pl.col("CATEGORIES").str.contains(category, literal=True)
过滤器表达式。 -
组合过滤器表达式:
它使用
reduce
函数和 lambda 函数将所有过滤器表达式与 OR 运算符 (|
) 组合成一个表达式。 -
应用过滤器:
将组合的过滤器表达式应用于
pl.scan_parquet
,然后像往常一样应用其他过滤器。
现在,有一个灵活的函数,可以接受任何类别列表来过滤的镶木地板文件。
标签:python,pytorch,parquet From: 78785761