如何在Polars DataFrame中按含重复值的条件筛选行
在Polars DataFrame中筛选允许重复值的行(块自举场景适用)
可以实现这个需求,以下是两种高效的方法,适配你提到的块自举场景:
示例数据
先定义你给出的示例DataFrame:
import polars as pl df = pl.DataFrame({ 'x':[0,1,2,3,4,5], 'y':[10,11,12,13,14,15], 'z':[0,0,1,1,2,2] }) z_select = [0,1,1]
方法1:左连接法(简洁高效)
通过创建包含筛选条件的临时DataFrame,与原DataFrame做左连接,自动匹配并重复提取对应行:
temp_df = pl.DataFrame({"z": z_select}) result = temp_df.join(df, on="z", how="left") print(result)
输出结果符合期望:
┌─────┬─────┬─────┐ │ z ┆ x ┆ y │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ 0 ┆ 0 ┆ 10 │ │ 0 ┆ 1 ┆ 11 │ │ 1 ┆ 2 ┆ 12 │ │ 1 ┆ 3 ┆ 13 │ │ 1 ┆ 2 ┆ 12 │ │ 1 ┆ 3 ┆ 13 │ └─────┴─────┴─────┘
原理:临时DataFrame里的每个z值会和原DataFrame中所有匹配的行关联,当z_select里有重复值时,对应的行组会被重复提取。
方法2:分组拼接法(直观可控)
先按z分组存储,再遍历筛选条件拼接对应行组:
# 按z分组,生成z值到行组的映射 group_map = {key: group for key, group in df.group_by("z", maintain_order=True)} # 遍历z_select,取出对应行组并拼接 result = pl.concat([group_map[z] for z in z_select]) print(result)
这种方法更直观,适合需要对每个分组做额外处理的场景,结果和方法1一致。
内容的提问来源于stack exchange,提问作者Paul Fleming
相关产品推荐
相关产品推荐

