如何在Python Pandas中对分组数据帧应用函数?

2024-10-02 10:28:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我将按dataframe的一个列对其进行分组,如下所示(例如irisdataset):

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

我想为每个组应用一个函数,它对grouped_iris中的列子集执行特定的操作。我如何应用一个函数来为每个组(每个Name)求和PetalLength和{},并将其放入一个名为SumLengthWidth的新列中?我知道我可以用agg对每个组的所有列求和,如下所示:

^{pr2}$

但我要找的是一个转折点:我不想对每个列的某个特定Name的所有条目求和,而只想对每个Name组的列(SepalWidth, SepalLength)的一个子集求和。谢谢。在


Tags: 函数nameirisdataframeby条目子集agg
2条回答

无法判断您是否需要聚合数(在这种情况下,Andy的解决方案就是您想要的),还是希望将其转换回原始数据帧。如果是后者,可以使用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将得到每个组的总和

^{pr2}$

在您的例子中,您有兴趣对这些行进行汇总:

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)

相关问题 更多 >

    热门问题