如何在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
相关产品推荐
相关产品推荐

