如何在Polars中实现类似pandas from_dummies的独热编码反转功能?
在Polars中反转独热编码(模拟pandas的
from_dummies) Polars目前没有内置的from_dummies方法,但可以通过unpivot+过滤+拆分列名+pivot的组合操作实现反转,具体步骤如下:
1. 准备示例数据
import polars as pl df = pl.DataFrame({ "col1_hi": [0,0,0,1,1], "col1_med": [0,0,1,0,0], "col1_lo": [1,1,0,0,0], "col2_yes": [1,1,0,1,0], "col2_no": [0,0,1,0,1], })
2. 链式实现反转操作
result = ( # 添加行索引,用于后续关联原始行 df.with_row_index("idx") # 宽表转长表:将每个独热列转为行记录 .unpivot(index="idx", variable_name="col", value_name="val") # 只保留独热编码为1的有效记录 .filter(pl.col("val") == 1) # 拆分列名(如col1_hi拆分为原始列名col1和分类值hi) .with_columns(pl.col("col").str.split("_", n=1).alias("split_col")) # 提取拆分后的原始列名和分类值 .select( "idx", orig_col=pl.col("split_col").list.get(0), category=pl.col("split_col").list.get(1) ) # 将长表转回宽表,恢复原始分类列结构 .pivot(index="idx", columns="orig_col", values="category") # 移除临时索引列 .drop("idx") ) print(result)
3. 输出结果
┌──────┬──────┐ │ col1 ┆ col2 │ │ --- ┆ --- │ │ str ┆ str │ ╞══════╪══════╡ │ lo ┆ yes │ │ lo ┆ yes │ │ med ┆ no │ │ hi ┆ yes │ │ hi ┆ no │ └──────┴──────┘
关键说明
with_row_index:必须添加索引,确保unpivot后能准确对应回原始行,避免分类值错位。str.split("_", n=1):n=1保证只拆分第一个下划线,适配列名格式为原始列名_分类值的场景;如果你的独热列用其他分隔符,替换下划线即可。- 整个流程通过链式调用完成,符合Polars的高效处理风格。
内容的提问来源于stack exchange,提问作者bkw1491
相关产品推荐
相关产品推荐

