如何使用pandas的groupby函数在numpy数组上应用函数
我刚接触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
如果你只想要这个向量的平均值,那就只计算一次平均值就可以了。