gpt4 book ai didi

python - 如何将函数应用于 Python pandas 中的分组数据框?

转载 作者:太空宇宙 更新时间:2023-11-03 15:20:55 25 4
gpt4 key购买 nike

我按其中一列对我的数据框进行分组,如下所示(iris 数据集示例):

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

我想为每个组应用一个函数,该函数对 grouped_iris 中的列子集执行特定操作。我如何为每个组(Name 的每个值)应用一个函数,将 PetalLengthPetalWidth 相加并将其放入名为 SumLengthWidth?我知道我可以像这样用 agg 对每组的所有列求和:

grouped_iris.agg(sum)

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

最佳答案

无法确定您是否需要汇总数字(在这种情况下,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,将 groupby 与 sum 聚合会得到每个组的总和

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

关于python - 如何将函数应用于 Python pandas 中的分组数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com