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

如何在Python Polars中实现类似R tidyverse的嵌套列表列?

在Polars中实现R tidyverse的group_by+nest功能

在R的tidyverse中,我们可以通过group_by()配合nest()创建包含列表列的数据集,每个列表元素对应一个分组后的小型DataFrame,这对批量拟合模型等场景非常实用。下面介绍如何在Python的Polars中实现相同效果。

示例Polars DataFrame

import polars as pl

df = pl.DataFrame(
    [
        pl.Series("dataset_id", [1, 1, 2, 2, 1, 1, 2, 2], dtype=pl.Int64),
        pl.Series("day", [1, 2, 1, 2, 1, 2, 1, 2], dtype=pl.Int64),
        pl.Series("recipe", [1, 1, 1, 1, 2, 2, 2, 2], dtype=pl.Int64),
        pl.Series("cum_trials", [1000, 2000, 1000, 2000, 1000, 2000, 1000, 2000], dtype=pl.Int64),
        pl.Series("cum_events", [644, 1287, 643, 1262, 645, 1312, 655, 1301], dtype=pl.Int64),
        pl.Series("cum_rate", [0.644, 0.643, 0.643, 0.619, 0.645, 0.667, 0.655, 0.646], dtype=pl.Float64),
    ]
)

实现分组嵌套(nest)

在Polars中,通过group_by()配合map_groups()可以精准复刻R中nest()的效果,将每组数据打包为独立的子DataFrame:

# 按dataset_id和day分组,生成包含子DataFrame的列表列
df_list = df.group_by(["dataset_id", "day"]).map_groups(
    lambda group: pl.DataFrame({"data": [group]})
)

查看结果

  • 查看嵌套后的完整数据集:
print(df_list)

输出包含dataset_id、day和data三列,data列的每个元素都是对应分组的小型DataFrame。

  • 访问第一个分组的子DataFrame:
print(df_list["data"][0])

补充:轻量级分组(仅生成列表)

如果不需要完整的子DataFrame,仅需将分组后的各列转为列表,可使用更简洁的agg方法:

# 将每组的列转为独立列表(非DataFrame列)
df_list_lists = df.group_by(["dataset_id", "day"]).agg(pl.all())

这种方式适合仅需提取单列分组数据的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:12:44