假设我有一个如下数据集:
data = {
"a": [1, 4, 2, 4, 7, 4],
"b": [4, 2, 3, 3, 0, 2],
"c": ["a", "b", "c", "d", "e", "f"],
}
并且我只想保留由和a + b
的单个组合唯一描述的行。我设法破解了这一点:a
b
df = (
pl.DataFrame(data)
.with_columns(sum_ab=pl.col("a") + pl.col("b"))
.group_by("sum_ab")
.agg(pl.col("a"), pl.col("b"), pl.col("c"))
.filter(
(pl.col("a").list.unique().list.len() == 1)
& (pl.col("b").list.unique().list.len() == 1)
)
.explode(["a", "b", "c"])
.select("a", "b", "c")
)
"""
shape: (2, 3)
┌─────┬─────┬─────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ str │
╞═════╪═════╪═════╡
│ 4 ┆ 2 ┆ b │
│ 4 ┆ 2 ┆ f │
└─────┴─────┴─────┘
"""
有人能建议一种更好的方法来实现同样的效果吗?我花了一些功夫才弄清楚这个逻辑,所以我想有一种更直接/更优雅的方法可以获得相同的结果。
.struct()
将a
和合并b
为一列,以便我们检查唯一性。n_unique()
检查唯一性。over()
将计算限制在范围内a + b
。如果您需要将其扩展到更大的列数,那么您可以使用它
sum_horizontal()
来使其更加通用:起始价
您可以使用 来
over
简化 group_by 和 explodes,否则这没什么不同。它还使用pl.all_horizontal
而不是&
和生成器(因此您可以轻松添加更多列)。需要注意的是,这会将 2+4 和 4+2 视为唯一组合,但我不知道这是否有意。