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

如何用pandas的transform()按组将列值合并为列表并新增列

问题描述

现有如下pandas DataFrame:

game = pd.DataFrame({
    'team': ['A', 'A', 'B', 'B', 'C', 'C', 'C'],
    'members': [1, 2, 3, 4, 5, 6, 7]
})
game

输出结果:

team  members
0    A        1
1    A        2
2    B        3
3    B        4
4    C        5
5    C        6
6    C        7

需求是按team分组,将members列的值合并为列表,添加为新列all_team_members,预期结果如下:

team  members  all_team_members
0    A        1            [1, 2]
1    A        2            [1, 2]
2    B        3            [3, 4]
3    B        4            [3, 4]
4    C        5         [5, 6, 7]
5    C        6         [5, 6, 7]
6    C        7         [5, 6, 7]

尝试了以下代码,但未得到预期结果:

game['all_teamm_members'] = game.groupby('team').members.transform(lambda x : x.tolist())

备注:已知可通过groupby+apply生成分组列表后合并回原DataFrame实现,但想了解如何用transform()完成此操作。

解决方案

你当前代码未达预期的原因,大概率是列名拼写错误(all_teamm_members多了一个字母m),或是旧版pandas对transform返回列表的处理逻辑不同。以下是两种用transform实现需求的正确写法:

  1. 显式生成与分组长度匹配的重复列表
    通过生成包含len(x)个分组列表的序列,确保每个分组的每一行都能拿到完整的成员列表:
game['all_team_members'] = game.groupby('team')['members'].transform(lambda x: [x.tolist()] * len(x))
  1. 利用transform的自动广播特性(推荐)
    当transform的函数返回一个标量(这里的分组列表属于单个标量对象)时,pandas会自动将其广播到该分组的所有行,写法更简洁:
game['all_team_members'] = game.groupby('team')['members'].transform(lambda x: x.tolist())

执行上述代码后,即可得到预期的结果。如果仍有问题,建议升级pandas到1.0及以上版本。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:57:36