给定一个带有分类列的数据框:
import polars as pl
df = pl.DataFrame({
"id": ["a", "a", "a", "b", "b", "b", "b"],
"value": [1,1,1,6,6,6,6],
})
res = df.with_columns(bucket = pl.col.value.cut([1,3]))
shape: (7, 3)
┌─────┬───────┬───────────┐
│ id ┆ value ┆ bucket │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ cat │
╞═════╪═══════╪═══════════╡
│ a ┆ 1 ┆ (-inf, 1] │
│ a ┆ 1 ┆ (-inf, 1] │
│ a ┆ 1 ┆ (-inf, 1] │
│ b ┆ 6 ┆ (3, inf] │
│ b ┆ 6 ┆ (3, inf] │
│ b ┆ 6 ┆ (3, inf] │
│ b ┆ 6 ┆ (3, inf] │
└─────┴───────┴───────────┘
pl.Expr.cat.get_categories()
作为字符串?
res.select(pl.col.bucket.cat.get_categories())
shape: (3, 1)
┌───────────┐
│ bucket │
│ --- │
│ str │
╞═══════════╡
│ (-inf, 1] │
│ (1, 3] │
│ (3, inf] │
└───────────┘
pl.Expr.to_physical()
获取物理表示中的所有现有值
res.select(pl.col.bucket.to_physical())
shape: (7, 1)
┌────────┐
│ bucket │
│ --- │
│ u32 │
╞════════╡
│ 0 │
│ 0 │
│ 0 │
│ 2 │
│ 2 │
│ 2 │
│ 2 │
└────────┘
但是我如何才能获得其物理表示中的所有潜在值呢? 我期望输出如下:
shape: (3, 1)
┌────────┐
│ bucket │
│ --- │
│ u32 │
╞════════╡
│ 0 │
│ 1 │
│ 2 │
└────────┘
或者我应该假设它总是被编码为没有间隙的整数范围?
pl.Expr.cat.get_categories
和 pl.Expr.to_physical
。
res.select(
pl.col("bucket").cat.get_categories().cast(res.schema["bucket"]).to_physical()
)
shape: (3, 1)
┌────────┐
│ bucket │
│ --- │
│ u32 │
╞════════╡
│ 0 │
│ 1 │
│ 2 │
└────────┘
pl.Expr.meta.dtype
,这样就可以避免需要 res
。