You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:32:39