如何将函数应用于Python熊猫中的分组数据框?

如何将函数应用于Python熊猫中的分组数据框?

问题描述:

我被它的一列编组我的数据框如下(例如与iris数据集):如何将函数应用于Python熊猫中的分组数据框?

grouped_iris = iris.groupby(by="Name") 

我想申请的是不特定的与列的grouped_iris一个子集东西每组的功能。我怎么能申请一个函数,为每个组(每个值Name)总和PetalLengthPetalWidth并把它放在一个新的名为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 
+0

你能解释更多什么'grouped_iris [cols] .transform(sum)'在这里正在做什么以及'transform'通常如何使用?查看其文档后,我仍然感到困惑。谢谢。 – user248237dfsf 2013-02-25 05:22:11

+0

更清楚了吗? – beardc 2013-02-25 12:43:32

这似乎有点不雅,但这项工作:

grouped_iris[['PetalLength', 'PetalWidth']].sum().sum(axis=1)