给定一个极点数据框,我想提取所有重复的行,同时应用额外的过滤条件,例如:
import polars as pl
df = pl.DataFrame({
"name": ["Alice", "Bob", "Alice", "David", "Eve", "Bob", "Frank"],
"city": ["NY", "LA", "NY", "SF", "LA", "LA", "NY"],
"age": [25, 30, 25, 35, 28, 30, 40]
})
# Trying this:
df.filter((df.is_duplicated()) & (pl.col("city") == "NY")) # error
然而,这会导致错误:
SchemaError:无法将一系列类型解包
object
为bool
这暗示着df.is_duplicated()
返回一系列类型object
,但实际上,它是一个Boolean
系列。
令人惊讶的是,通过将表达式放在第一位来重新排序谓词可以使其起作用(但为什么呢?):
df.filter((pl.col("city") == "NY") & (df.is_duplicated())) # works!
正确输出:
shape: (2, 3)
┌───────┬──────┬─────┐
│ name ┆ city ┆ age │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞═══════╪══════╪═════╡
│ Alice ┆ NY ┆ 25 │
│ Alice ┆ NY ┆ 25 │
└───────┴──────┴─────┘
我理解,根据列的子集过滤重复项时的最佳方法是使用pl.struct
,例如:
df.filter((pl.struct(df.columns).is_duplicated()) & (pl.col("city") == "NY")) # works
它可以与附加过滤条件配合使用。
但是,我故意不使用pl.struct
,因为我的实际数据框有 40 列,并且我想根据除三列之外的所有列检查重复的行,因此我执行了以下操作:
df.filter(df.drop("col1", "col2", "col3").is_duplicated())
这可以正常工作,并且比将所有 37 列都写入 方便得多pl.struct
。但是,在右侧添加额外的过滤条件时,这种情况会中断,但在左侧不会中断:
df.filter(
(df.drop("col1", "col2", "col3").is_duplicated()) & (pl.col("col5") == "something")
) # breaks!
df.filter(
(pl.col("col5") == "something") & (df.drop("col1", "col2", "col3").is_duplicated())
) # works!
在这种情况下,为什么谓词的顺序(序列与表达式 vs. 表达式与序列)很重要.filter()
?这是 Polars 的预期行为,还是一个 bug?
错误不
.filter()
具体。而且我不认为这是一个错误。表达式允许您在 RHS 上使用系列,它将返回一个表达式。
但反过来
就没有意义了,而且会出现错误。至于使用结构体,您可以将其包装
.exclude()
在结构体中。