簡體   English   中英

如何將函數應用於Python pandas中的分組數據幀?

[英]how to apply functions to grouped dataframes in Python pandas?

我正在通過其中一個列對我的數據幀進行分組,如下所示(使用iris數據集的示例):

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

我想為每個組應用一個函數,該函數使用grouped_iris中的列的子集執行特定grouped_iris 我怎么能應用一個函數,每個組( Name每個值)總和PetalLengthPetalWidth並將它放在一個名為SumLengthWidth的新列中? 我知道,我可以總結每個組中的所有列與agg是這樣的:

grouped_iris.agg(sum)

但我正在尋找的是一個扭曲:不是總結每列的特定Name所有條目,我想只為每個Name組的列的一個子集( SepalWidth, SepalLengthSepalWidth, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM