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

如何对Pandas列表类型Series按ID进行逐元素求和(Zip Sum)

按ID分组对列表类型列执行逐元素求和的解决方案

原数据与需求

给定如下DataFrame:

import pandas as pd
df = pd.DataFrame([{'id': "A", 'inv' : [1,2,3,4,5]},
                   {'id': "A", 'inv' : [1,2,3,4,5]},
                   {'id': "B", 'inv' : [1,2,3,4,5]},
                   {'id': "B", 'inv' : [1,2,3,4,5]}])

需要按id分组,对每组inv列的列表元素执行逐元素求和,得到目标结果:

pd.DataFrame([{'id': "A", 'inv' : [2,4,6,8,10]},
              {'id': "B", 'inv' : [2,4,6,8,10]}])

(注:你提供的目标结果中第三项为3,应为笔误,正确结果应为6)

解决方案

方法1:使用groupby+apply结合zip

利用zip(*x)将每组内的列表按位置打包,再对每个位置的元素求和:

result = df.groupby('id')['inv'].apply(lambda x: [sum(i) for i in zip(*x)]).reset_index(name='inv')
  • zip(*x):将每组中所有列表的对应位置元素打包成元组,例如A组会得到(1,1), (2,2), (3,3), (4,4), (5,5)
  • 列表推导式遍历每个元组,执行sum()得到逐元素求和结果

方法2:借助Numpy数组操作

将列表转换为Numpy二维数组,按行方向求和后再转回列表:

import numpy as np

result = df.groupby('id')['inv'].apply(lambda x: np.sum(np.array(x.tolist()), axis=0).tolist()).reset_index(name='inv')
  • x.tolist():将分组后的Series转为列表的列表
  • np.array():转换为二维数组,axis=0表示按列(即原列表的元素位置)求和
  • .tolist():将求和后的Numpy数组转回普通列表

验证结果

执行上述任意代码后,result即为目标DataFrame:

id          inv
0  A  [2, 4, 6, 8, 10]
1  B  [2, 4, 6, 8, 10]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:50:03