我有以下数据框:
import polars as pl
df = pl.DataFrame({
'ID': [1, 1, 5, 5, 7, 7, 7],
'YEAR': [2025, 2025, 2023, 2024, 2020, 2021, 2021]
})
shape: (7, 2)
┌─────┬──────┐
│ ID ┆ YEAR │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞═════╪══════╡
│ 1 ┆ 2025 │
│ 1 ┆ 2025 │
│ 5 ┆ 2023 │
│ 5 ┆ 2024 │
│ 7 ┆ 2020 │
│ 7 ┆ 2021 │
│ 7 ┆ 2021 │
└─────┴──────┘
现在我想获得每个 ID 的唯一年数,即
shape: (7, 3)
┌─────┬──────┬──────────────┐
│ ID ┆ YEAR ┆ UNIQUE_YEARS │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ u32 │
╞═════╪══════╪══════════════╡
│ 1 ┆ 2025 ┆ 1 │
│ 1 ┆ 2025 ┆ 1 │
│ 5 ┆ 2023 ┆ 2 │
│ 5 ┆ 2024 ┆ 2 │
│ 7 ┆ 2020 ┆ 2 │
│ 7 ┆ 2021 ┆ 2 │
│ 7 ┆ 2021 ┆ 2 │
└─────┴──────┴──────────────┘
我尝试了一下df.with_columns(pl.col('YEAR').over('ID').alias('UNIQUE_YEARS'))
,但结果却不对。所以我想到了
df.join(df.group_by('ID').agg(pl.col('YEAR').unique().len().alias('UNIQUE_YEARS')), on='ID', how='left')
这确实给出了正确的结果!但它看起来有点笨重,我想知道有没有更自然的方式使用with_columns
和over
?