![](/img/trans.png)
[英]How to apply multiple custom functions on multiple columns in grouped DataFrame in pandas?
[英]how to apply functions to grouped dataframes in Python pandas?
我正在通過其中一個列對我的數據幀進行分組,如下所示(使用iris
數據集的示例):
grouped_iris = iris.groupby(by="Name")
我想為每個組應用一個函數,該函數使用grouped_iris
中的列的子集執行特定grouped_iris
。 我怎么能應用一個函數,每個組( Name
每個值)總和PetalLength
和PetalWidth
並將它放在一個名為SumLengthWidth
的新列中? 我知道,我可以總結每個組中的所有列與agg
是這樣的:
grouped_iris.agg(sum)
但我正在尋找的是一個扭曲:不是總結每列的特定Name
所有條目,我想只為每個Name
組的列的一個子集( SepalWidth, SepalLength
) SepalWidth, SepalLength
。 謝謝。
這似乎有點不優雅,但做的工作:
grouped_iris[['PetalLength', 'PetalWidth']].sum().sum(axis=1)
無法判斷您是否需要匯總數字(在這種情況下,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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.