Polars:将分类列设置为特定值,同时保持分类类型
Polars: Setting categorical column to a specific value while keeping categorical type
有人可以帮助我为极坐标数据框的某些行设置分类值(基于条件)的首选方法吗?
现在我想出了一个解决方案,将原始数据框分成两部分(条件==真和条件==假)。我在第一部分设置了分类值,然后再次将它们连接在一起。
┌────────┬──────┐
│ column ┆ more │
│ --- ┆ --- │
│ cat ┆ i32 │
╞════════╪══════╡
│ a ┆ 1 │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ b ┆ 5 │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ e ┆ 9 │ <- I want to set column to 'b' for all rows where it is 'e'
└────────┴──────┘
import polars as pl
df = pl.DataFrame(data={'column': ['a', 'b', 'e'], 'values': [1, 5, 9]}, columns=[('column', pl.Categorical), ('more', pl.Int32)])
print(df)
b_cat_value = df.filter(pl.col('column')=='b')['column'].unique()
df_e_replaced_with_b = df.filter(pl.col('column')=='e').with_column(b_cat_value.alias('column'))
df_no_e = df.filter(pl.col('column')!='e')
print(pl.concat([df_no_e, df_e_replaced_with_b]))
输出符合预期:
┌────────┬──────┐
│ column ┆ more │
│ --- ┆ --- │
│ cat ┆ i32 │
╞════════╪══════╡
│ a ┆ 1 │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ b ┆ 5 │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ b ┆ 9 │ <- column has been set to 'b'
└────────┴──────┘
有没有更直接的 forward/canonical 来获得 b_cat_value
,比如类似于 df['column'].dtype['b']
的东西?
以及如何在条件表达式中使用它而不像上面的示例那样拆分数据框?类似于...
df.with_column(
pl.when(pl.col('column') == 'e').then(b_cat_value).otherwise(pl.col('column'))
)
从 polars>=0.13.33
开始,您可以简单地使用 string
设置分类值,并且 Categorical
dtype 将被保留。
所以在这种情况下:
df.with_column(
pl.when(pl.col("column") == "e").then("b").otherwise(pl.col("column"))
)
有人可以帮助我为极坐标数据框的某些行设置分类值(基于条件)的首选方法吗?
现在我想出了一个解决方案,将原始数据框分成两部分(条件==真和条件==假)。我在第一部分设置了分类值,然后再次将它们连接在一起。
┌────────┬──────┐
│ column ┆ more │
│ --- ┆ --- │
│ cat ┆ i32 │
╞════════╪══════╡
│ a ┆ 1 │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ b ┆ 5 │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ e ┆ 9 │ <- I want to set column to 'b' for all rows where it is 'e'
└────────┴──────┘
import polars as pl
df = pl.DataFrame(data={'column': ['a', 'b', 'e'], 'values': [1, 5, 9]}, columns=[('column', pl.Categorical), ('more', pl.Int32)])
print(df)
b_cat_value = df.filter(pl.col('column')=='b')['column'].unique()
df_e_replaced_with_b = df.filter(pl.col('column')=='e').with_column(b_cat_value.alias('column'))
df_no_e = df.filter(pl.col('column')!='e')
print(pl.concat([df_no_e, df_e_replaced_with_b]))
输出符合预期:
┌────────┬──────┐
│ column ┆ more │
│ --- ┆ --- │
│ cat ┆ i32 │
╞════════╪══════╡
│ a ┆ 1 │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ b ┆ 5 │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ b ┆ 9 │ <- column has been set to 'b'
└────────┴──────┘
有没有更直接的 forward/canonical 来获得 b_cat_value
,比如类似于 df['column'].dtype['b']
的东西?
以及如何在条件表达式中使用它而不像上面的示例那样拆分数据框?类似于...
df.with_column(
pl.when(pl.col('column') == 'e').then(b_cat_value).otherwise(pl.col('column'))
)
从 polars>=0.13.33
开始,您可以简单地使用 string
设置分类值,并且 Categorical
dtype 将被保留。
所以在这种情况下:
df.with_column(
pl.when(pl.col("column") == "e").then("b").otherwise(pl.col("column"))
)