如何使用pandas的groupby函数在numpy数组上应用函数

4 投票
2 回答
2371 浏览
提问于 2025-04-18 07:40

我刚接触pandas,希望这个问题能有个简单的答案(也非常感谢任何关于如何设置数据框的建议)

假设我有一个这样的数据框:

D = pd.DataFrame({ i:{ "name":str(i),
                       "vector": np.arange(i,i+10),
                       "sq":i**2,
                       "gp":i%3 } for i in range(10) }).T

    gp  name sq  vector
0    0   0   0   [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1    1   1   1   [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2    2   2   4   [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
3    0   3   9   [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
4    1   4   16  [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
5    2   5   25  [5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
6    0   6   36  [6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
7    1   7   49  [7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
8    2   8   64  [8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
9    0   9   81  [9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

现在我想按照“gp”来分组,并计算“vector”的平均值

我试过

D.groupby('gp').mean()

甚至还试过

D.groupby('gp').agg( np.mean )

但我收到一个错误提示,说没有可以进行聚合的“数值类型”。所以在pandas中,np.arrays就不能用吗?

2 个回答

2

在单元格中使用数组并不是个好主意,你可以把向量列转换成多列:

D = pd.DataFrame({ i:{ "name":str(i),
                       "vector": np.arange(i,i+10),
                       "sq":i**2,
                       "gp":i%3 } for i in range(10) }).T
df = pd.concat([D[["gp", "name", "sq"]], pd.DataFrame(D.vector.tolist(), index=D.index)], axis=1, keys=["attrs", "vector"])
print df.groupby([("attrs", "gp")]).mean()

这里是输出结果:

                  vector                                                  
                  0    1    2    3    4     5     6     7     8     9
(attrs, gp)                                                          
0               4.5  5.5  6.5  7.5  8.5   9.5  10.5  11.5  12.5  13.5
1               4.0  5.0  6.0  7.0  8.0   9.0  10.0  11.0  12.0  13.0
2               5.0  6.0  7.0  8.0  9.0  10.0  11.0  12.0  13.0  14.0
3

对我来说,这样可以:

D.groupby('gp').apply(lambda x: x.vector.mean().mean())

我计算了两次平均值,因为你想要的是这个向量的平均值的平均值,对吧?

Out[98]: 
gp
0     9.0
1     8.5
2     9.5
dtype: float64

如果你只想要这个向量的平均值,那就只计算一次平均值就可以了。

撰写回答