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

在Pandas GroupBy中用numpy.vstack聚合报错,如何生成分组二维数组?

解决Pandas分组聚合生成二维NumPy数组的问题

我来帮你搞定这个问题!你之前遇到的Exception: Must produce aggregated value错误,是因为在agg方法里重复使用了同一个列名histogram作为键,Pandas无法正确解析这种重复定义的聚合操作。

正确的Pandas风格实现方法

其实你不需要用字典形式的agg,直接对分组后的histogram列使用apply方法调用np.vstack就可以达到目的,代码更简洁直观:

import pandas as pd
import numpy as np

# 初始化你的DataFrame
d = {'group' : [1, 1, 2, 2], 'histogram' : [[1,2,3], [4,5,6], [7,8,9],[10,11,12]]}
df = pd.DataFrame(d)

# 分组并聚合生成二维数组
grouped_arrays = df.groupby('group')['histogram'].apply(np.vstack)

执行后,grouped_arrays是一个Pandas Series:

  • 索引是分组的group值(1和2)
  • 每个元素对应分组的二维NumPy数组,比如grouped_arrays[1]会输出:
    array([[1, 2, 3],
           [4, 5, 6]])
    
    这里形状是(2, 3)(因为我们把每个子列表作为行堆叠),如果需要转成你描述的(3,2)形状,可以在apply里加上转置操作:apply(lambda x: np.vstack(x).T)。

用agg方法的替代写法

如果你更倾向于用agg方法,可以给聚合操作指定一个新的列名,避免重复键的问题:

grouped_df = df.groupby('group').agg(
    histogram_array=('histogram', np.vstack)
)

这样得到的是一个DataFrame,histogram_array列里存储着每个分组的二维数组,用法和上面的Series类似。

适配Keras模型的小技巧

因为你最终要把这些数组传入Keras模型,如果所有分组的数组形状一致(比如你的例子里都是2行3列),可以直接把结果转成三维NumPy数组,方便模型输入:

# 转成三维数组,形状为(分组数, 行数, 列数)
keras_input = np.array(grouped_arrays.tolist())
# 输出形状:(2, 2, 3)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:25:55