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

如何将Polars分组后含list类型列的DataFrame导出为CSV?

Polars分组后含列表列导出CSV的解决方案

问题场景

使用Polars对DataFrame分组后,某列变为list[str]类型,直接导出CSV时因CSV不支持嵌套数据报错;尝试直接将列表列转为字符串类型失败;使用explode会保留列表结构,不符合导出需求。

原始数据代码

import polars as pl

df = pl.DataFrame({
    "Column A": ["Variable 1", "Variable 2", "Variable 2", "Variable 3", "Variable 3", "Variable 4"],
    "Column B": ["AB", "AB", "CD", "AB", "CD", "CD"]
})

分组代码及结果

df.group_by("Column A").agg(pl.col("Column B").unique())

分组后输出:

shape: (4, 2)
┌────────────┬──────────────┐
│ Column A   ┆ Column B     │
│ ---        ┆ ---          │
│ str        ┆ list[str]    │
╞════════════╪══════════════╡
│ Variable 4 ┆ ["CD"]       │
│ Variable 2 ┆ ["CD", "AB"] │
│ Variable 3 ┆ ["AB", "CD"] │
│ Variable 1 ┆ ["AB"]       │
└────────────┴──────────────┘

遇到的错误

  1. 直接导出CSV报错:

ComputeError: CSV format does not support nested data. Consider using a different data format. Got: 'list[str]'

  1. 尝试直接转换列表为字符串报错:
(df
   .group_by("Column A").agg(pl.col("Column B").unique())
   .with_columns(pl.col("Column B").cast(pl.String))
)

InvalidOperationError: cannot cast List type (inner: 'String', to: 'String')

  1. 使用explode不符合预期:
df.group_by("Column A").agg(pl.col("Column B").unique().explode())

结果仍保留列表结构,无法导出CSV。

便捷解决方案

核心思路是将list[str]列转换为字符串格式,让CSV可以识别。以下提供两种方法:

方法1:快速转换(适合小数据量)

使用map_elements(str)将列表直接转为Python字符串格式:

# 分组并转换列表列为字符串
result_df = df.group_by("Column A").agg(pl.col("Column B").unique()) \
              .with_columns(pl.col("Column B").map_elements(str))

# 导出CSV
result_df.write_csv("grouped_output.csv")

导出的CSV内容示例:

Column A,Column B
Variable 4,"['CD']"
Variable 2,"['CD', 'AB']"
Variable 3,"['AB', 'CD']"
Variable 1,"['AB']"

方法2:自定义格式(适合大数据量/特定格式需求)

使用Polars内置列表函数构建符合期望的字符串格式(如双引号包裹的列表),避免逐行处理的性能损耗:

result_df = df.group_by("Column A").agg(pl.col("Column B").unique()) \
              .with_columns(
                  pl.col("Column B")
                  .list.join('", "')  # 用", "连接列表元素
                  .map_elements(lambda x: f'["{x}"]', return_dtype=pl.String)  # 包裹成列表格式字符串
              )

result_df.write_csv("grouped_output_custom.csv")

导出的CSV内容示例:

Column A,Column B
Variable 4,"[""CD""]"
Variable 2,"[""CD"", ""AB""]"
Variable 3,"[""AB"", ""CD""]"
Variable 1,"[""AB""]"

说明

  • 直接cast(pl.String)失败是因为Polars不支持嵌套类型直接转为基础字符串类型,必须显式将列表内容转为字符串表示。
  • explode的作用是将列表展开为多行,但会破坏分组后的一行对应一个分组的结构,因此不适用。

内容的提问来源于stack exchange,提问作者miroslaavi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:25:32