You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Polars DataFrame中结合额外条件正确提取所有重复行?

如何在Polars DataFrame中结合额外条件正确提取所有重复行?

嘿,我刚好踩过类似的坑,给你分两种常见场景捋捋,你可以根据自己的实际需求来选:

首先先把你给的DataFrame补全(你原来的代码里Frank的city字段没写完,我默认补成Chicago啦):

import polars as pl
df = pl.DataFrame({
    "name": ["Alice", "Bob", "Alice", "David", "Eve", "Bob", "Frank"],
    "city": ["NY", "LA", "NY", "SF", "LA", "LA", "Chicago"]
})

场景1:只保留重复行中自身满足额外条件的行

比如你要找「名字重复,并且这行的城市是LA」的所有行,直接用filter把重复标记和你的过滤条件结合起来就行:

# 筛选name重复 且 city为LA的行
result = df.filter(
    pl.col("name").is_duplicated() & (pl.col("city") == "LA")
)
print(result)

运行后会得到Bob的两行——它们名字重复,且城市都是LA;而Alice的两行虽然名字重复,但城市是NY,所以不会被选出来,完全贴合咱们的要求。

场景2:提取整个重复组(组内至少有一行满足额外条件)

如果你想要的是「只要某个名字的重复分组里存在至少一行城市是LA,就把这个组里所有重复行都捞出来」(哪怕组里有行不是LA),比如假设Bob有一行LA一行NY,那两行都要保留,这时候就需要先给每个分组打标记再过滤:

# 先给每个name组标记是否有城市为LA的行,再筛选符合条件的重复行
result = df.with_columns(
    # 标记当前行是否满足city=LA
    current_is_la = pl.col("city") == "LA",
    # 按name分组,判断整个组里有没有满足条件的行
    group_has_la = pl.col("current_is_la").any().over("name")
).filter(
    pl.col("name").is_duplicated() & pl.col("group_has_la")
)
print(result)

这种写法能把整个符合条件的重复分组数据都拿出来,适合你需要复盘某个重复分组全部信息的场景。

另外提个小细节:is_duplicated()会标记所有重复的行(包括第一次出现的那行),如果你只想要重复项里的非首次/末次行,就换成is_first_duplicate()或者is_last_duplicate()就行,根据自己的需求调整~

备注:内容来源于stack exchange,提问作者Omar AlSuwaidi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:14:33