如何用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实现需求的正确写法:
- 显式生成与分组长度匹配的重复列表
通过生成包含len(x)个分组列表的序列,确保每个分组的每一行都能拿到完整的成员列表:
game['all_team_members'] = game.groupby('team')['members'].transform(lambda x: [x.tolist()] * len(x))
- 利用
transform的自动广播特性(推荐)
当transform的函数返回一个标量(这里的分组列表属于单个标量对象)时,pandas会自动将其广播到该分组的所有行,写法更简洁:
game['all_team_members'] = game.groupby('team')['members'].transform(lambda x: x.tolist())
执行上述代码后,即可得到预期的结果。如果仍有问题,建议升级pandas到1.0及以上版本。
内容的提问来源于stack exchange,提问作者PingPong
相关产品推荐
相关产品推荐

