在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
相关产品推荐
相关产品推荐

