如何优化Polars DataFrame中多列答案的整合方法
简洁高效的Polars宽表转窄表方案
针对你需要将多Answer列的DataFrame转换为仅保留Question和单个Answer列的需求,以下是两种比拆分拼接更简洁高效的实现方式:
方法1:使用melt+filter批量转换
先将所有Answer列转换为键值对格式,再筛选出与当前行Question匹配的记录:
import polars as pl data = { "ID" : [1,1,1], "Question" : ["A","B","C"], "Answer A" : ["Answer A", "Answer A", "Answer A"], "Answer B" : ["Answer B", "Answer B", "Answer B"], "Answer C" : ["Answer C", "Answer C", "Answer C"] } df = pl.DataFrame(data) df_final = ( df # 将所有Answer列转为变量名-值的格式 .melt(id_vars=["ID", "Question"], variable_name="Answer_Col", value_name="Answer") # 筛选出Answer列名与Question匹配的行(比如Question为"A"时,匹配"Answer A") .filter(pl.col("Answer_Col") == pl.concat_str(["Answer ", pl.col("Question")])) # 移除不需要的中间列 .drop("Answer_Col") ) print(df_final)
方法2:按Question直接提取对应Answer列(更高效)
利用Polars的行级计算,直接根据Question的值动态选取对应的Answer列,避免生成冗余的中间行:
df_final = ( df .with_columns( # 按Question的值拼接出对应的Answer列名,然后提取该列的值 Answer=pl.col(pl.concat_str(["Answer ", pl.col("Question")])) ) # 只保留需要的列 .select(["ID", "Question", "Answer"]) ) print(df_final)
这两种方法的优势:
- 代码简洁,无需重复编写多组拆分过滤逻辑
- 扩展性强,新增Question/Answer列时无需修改代码
- 方法2的性能更优,因为不需要展开所有Answer列再筛选
内容的提问来源于stack exchange,提问作者user24900119
相关产品推荐
相关产品推荐

