首页 > 解决方案 > numpy.vstack 作为 pandas groupy 中的聚合器

问题描述

我有一个熊猫数据框:

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

在此处输入图像描述

数据框包含直方图分析的结果。目标是为每组创建 2D numpy 数组。IE

对于第 1 组,二维 numpy 数组将是np.array([[1,2,3],[4,5,6]]). 形状将是 (3,2)

我尝试了以下方法:

df_test = pd.DataFrame(df.groupby("group").agg({'histogram':'count',
                                             'histogram':lambda x: np.vstack(x)}))

但是我收到以下错误:

例外:必须产生聚合值

我当然可以遍历数据框,按组过滤并使用

np.vstack(df_filtered["histogram"])

但我想一定有一种对熊猫更友好的方式。最终我会将二维数组解析为 Keras 模型。

标签: pandasnumpypandas-groupby

解决方案


关闭您需要的是将其转换为列表:

df_test = (pd.DataFrame(df.groupby("group")['histogram']
             .agg([('c', 'count'),('2d',lambda x: np.vstack(x).tolist())])))
print (df_test)
       c                         2d
group                              
1      2     [[1, 2, 3], [4, 5, 6]]
2      2  [[7, 8, 9], [10, 11, 12]]

或使用GroupBy.apply

f = lambda x: pd.DataFrame([[len(x), np.vstack(x)]], columns=['c','2d'])
df_test = df.groupby("group")['histogram'].apply(f).reset_index(level=1, drop=True)
print (df_test)
       c                         2d
group                              
1      2     [[1, 2, 3], [4, 5, 6]]
2      2  [[7, 8, 9], [10, 11, 12]]

推荐阅读