如何对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
相关产品推荐
相关产品推荐

