如何将函数应用于Python熊猫中的分组数据框?
问题描述:
我被它的一列编组我的数据框如下(例如与iris
数据集):如何将函数应用于Python熊猫中的分组数据框?
grouped_iris = iris.groupby(by="Name")
我想申请的是不特定的与列的grouped_iris
一个子集东西每组的功能。我怎么能申请一个函数,为每个组(每个值Name
)总和PetalLength
和PetalWidth
并把它放在一个新的名为SumLengthWidth
?我知道,我可以总结每个组中的所有列与agg
这样的:
grouped_iris.agg(sum)
但是我正在寻找的是在此一拧:不是总结特定Name
的所有条目为每列,我只想为每个Name
组求和仅列的一个子集(SepalWidth, SepalLength
)。谢谢。
答
如果你想要的总人数(在这种情况下,安迪的解决方案是你想要的)
也说不清,或者如果你想转换回进入原始数据帧。如果是后者,你可以使用transform
In [33]: cols = ['PetalLength', 'PetalWidth']
In [34]: transformed = grouped_iris[cols].transform(sum).sum(axis=1)
In [35]: iris['SumLengthWidth'] = transformed
In [36]: iris.head()
Out[36]:
SepalLength SepalWidth PetalLength PetalWidth Name SumLengthWidth
0 5.1 3.5 1.4 0.2 Iris-setosa 85.4
1 4.9 3.0 1.4 0.2 Iris-setosa 85.4
2 4.7 3.2 1.3 0.2 Iris-setosa 85.4
3 4.6 3.1 1.5 0.2 Iris-setosa 85.4
4 5.0 3.6 1.4 0.2 Iris-setosa 85.4
编辑:一般情况下,例如
在一般情况下,一个数据帧df
,与sum
聚集GROUPBY提供了各组的总和
In [47]: df
Out[47]:
Name val1 val2
0 foo 6 3
1 bar 17 4
2 foo 16 6
3 bar 7 3
4 foo 6 13
5 bar 7 1
In [48]: grouped = df.groupby('Name')
In [49]: grouped.agg(sum)
Out[49]:
val1 val2
Name
bar 31 8
foo 28 22
就你而言,你有兴趣在行上对这些数据进行求和:
In [50]: grouped.agg(sum).sum(axis=1)
Out[50]:
Name
bar 39
foo 50
但是,这只给你2个数字;每组1个。在一般情况下,如果你想投射回至原数据帧这两个数字,要使用transform
:
In [51]: grouped.transform(sum)
Out[51]:
val1 val2
0 28 22
1 31 8
2 28 22
3 31 8
4 28 22
5 31 8
注意这些值是如何完全相同的由agg
,但产生的值是它与原来的df
具有相同的尺寸。还要注意每个其他值是如何重复的,因为行[0,2,4]和[1,3,5]是相同的组。在你的情况下,你需要两个值的总和,所以你可以在行之间进行总和。
In [52]: grouped.transform(sum).sum(axis=1)
Out[52]:
0 50
1 39
2 50
3 39
4 50
5 39
现在有一系列的相同长度的原始数据帧,这样你就可以将它早在一列(或做你用它喜欢):
In [53]: df['val1 + val2 by Name'] = grouped.transform(sum).sum(axis=1)
In [54]: df
Out[54]:
Name val1 val2 val1 + val2 by Name
0 foo 6 3 50
1 bar 17 4 39
2 foo 16 6 50
3 bar 7 3 39
4 foo 6 13 50
5 bar 7 1 39
答
这似乎有点不雅,但这项工作:
grouped_iris[['PetalLength', 'PetalWidth']].sum().sum(axis=1)
你能解释更多什么'grouped_iris [cols] .transform(sum)'在这里正在做什么以及'transform'通常如何使用?查看其文档后,我仍然感到困惑。谢谢。 – user248237dfsf 2013-02-25 05:22:11
更清楚了吗? – beardc 2013-02-25 12:43:32