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

Pandas groupby聚合不同形状数组列求和报广播错误如何解决

问题场景

使用pandas的aggregate逻辑对分组后列的所有值求和,测试构造DataFrame代码如下:

import pandas as pd
import numpy as np

df2 = pd.DataFrame([[1,  np.array([2, 5, 3])],
                   [1,  np.array([2, 5, 3])],
                   [1, np.array([2, 5, 3, 5, 3])]],
                 columns=['doc_id', 'topic_dist'])

初始编写的聚合代码如下,目标是对不同形状的数组完成聚合计算:

def getsumcolumns(dfsource):
    grouped = dfsource.groupby('doc_id')
    aggregate = list((k, v["topic_dist"].sum()) for k, v in grouped) 
    df_results = pd.DataFrame(aggregate, columns=['doc_id','topic_dist'])
    print(df_results)
    return df_results 

运行代码触发如下错误:

operands could not be broadcast together with shapes (3,) (5,) 

预期得到的输出结果为:

doc_id  topic_dist
0       1  [6, 15, 9, 5, 3]
错误原因

直接对存储numpy数组的Series调用.sum()方法时,pandas会沿用numpy的数组运算逻辑,要求所有参与运算的数组形状一致,按位置做逐元素相加。当前同组内的数组长度分别为3、3、5,不满足numpy广播规则,因此触发形状不匹配报错。

可行实现方案

分组后对每组内的数组,先按组内最长数组的长度做对齐,长度不足的位置默认补0,再逐位求和即可。修改后的聚合代码如下:

from itertools import zip_longest

def getsumcolumns(dfsource):
    agg_result = []
    for doc_id, group_data in dfsource.groupby('doc_id'):
        # 按位置对齐所有数组,缺位补0后逐位求和
        sum_array = np.array([
            sum(position_values) 
            for position_values in zip_longest(*group_data['topic_dist'], fillvalue=0)
        ])
        agg_result.append((doc_id, sum_array))
    df_results = pd.DataFrame(agg_result, columns=['doc_id','topic_dist'])
    print(df_results)
    return df_results

传入测试DataFrame调用该函数,即可得到符合预期的输出结果,该方案可以自动适配组内任意不同长度的数组,不需要手动指定数组维度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:27:19