Python Pandas - 聚合操作



資料聚合是資料分析中的一個關鍵步驟,尤其是在處理大型資料集時。在 Pandas 中,您可以使用 DataFrame.agg() 方法執行聚合操作。此方法非常靈活,可以執行各種操作來彙總和分析您的資料。Pandas 中的聚合操作可以應用於索引軸(預設)或列軸。

在本教程中,我們將討論如何使用 DataFrame.agg() 方法執行各種聚合技術,包括如何應用多個聚合函式、為特定列自定義聚合以及同時處理行和列。

瞭解 DataFrame.agg() 方法

DataFrame.agg() 方法(aggregate 的別名)是一個強大的工具,允許您將一個或多個聚合函式應用於 DataFrame,無論是跨行還是跨列,從而提供資料的摘要。

語法

以下是語法:

DataFrame.agg(func=None, axis=0, *args, **kwargs)

其中,

  • func:此引數指定要應用的聚合函式。它接受單個函式或函式名(例如,np.sum、'mean')、函式或函式名的列表,或者將軸標籤對映到函式的字典。

  • axis:指定應用聚合的軸。0 或 'index' 將函式應用於每一列(預設),而 1 或 'columns' 將函式應用於每一行。

  • *args:傳遞給聚合函式的位置引數。

  • **kwargs:傳遞給聚合函式的關鍵字引數。

agg() 方法的結果取決於輸入,如果使用單個函式,則返回標量Series,如果應用多個函式,則返回DataFrame

在 DataFrame 行上應用聚合

您可以使用 agg 函式在行(索引軸)上聚合多個函式。此方法將指定的聚合函式應用於 DataFrame 中的每一列。

示例

讓我們建立一個 DataFrame 並對其應用聚合函式summin。在本例中,sum 和 min 函式應用於每一列,提供資料的摘要。

import pandas as pd
import numpy as np

df = pd.DataFrame([[1, 2, 3, 1],
                   [4, 5, 6, np.nan],
                   [7, 8, 9, 2],
                   [np.nan, 2, np.nan, 3]],
   index = pd.date_range('1/1/2024', periods=4),
   columns = ['A', 'B', 'C', 'D'])

print("Input DataFrame:\n",df)
result = df.agg(['sum', 'min'])
print("\nResults:\n",result)

輸出如下:

Input DataFrame:
               A  B    C    D
2024-01-01  1.0  2  3.0  1.0
2024-01-02  4.0  5  6.0  NaN
2024-01-03  7.0  8  9.0  2.0
2024-01-04  NaN  2  NaN  3.0

Results:
         A   B     C    D
sum  12.0  17  18.0  6.0
min   1.0   2   3.0  1.0

為每一列應用不同的函式

您還可以透過將字典傳遞給 agg 函式,為不同的列應用不同的聚合函式。字典中的每個鍵對應一列,值是要應用的聚合函式列表。

import pandas as pd
import numpy as np

df = pd.DataFrame([[1, 2, 3, 1],
                   [4, 5, 6, np.nan],
                   [7, 8, 9, 2],
                   [np.nan, 2, np.nan, 3]],
   index = pd.date_range('1/1/2024', periods=4),
   columns = ['A', 'B', 'C', 'D'])

print("Input DataFrame:\n",df)
result = df.agg({'A': ['sum', 'min'], 'B': ['min', 'max']})
print("\nResults:\n",result)

執行上述程式碼後,它會產生以下輸出:

Input DataFrame:
               A  B    C    D
2024-01-01  1.0  2  3.0  1.0
2024-01-02  4.0  5  6.0  NaN
2024-01-03  7.0  8  9.0  2.0
2024-01-04  NaN  2  NaN  3.0

Results:
         A    B
sum  12.0  NaN
min   1.0  2.0
max   NaN  8.0

對單個列應用聚合

您可以將聚合函式應用於單個列,例如計算滾動總和。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10, 4),
   index = pd.date_range('1/1/2000', periods=10),
   columns = ['A', 'B', 'C', 'D'])
print(df)
r = df.rolling(window=3,min_periods=1)
print(r['A'].aggregate(np.sum))

輸出如下:

                 A           B           C           D
2000-01-01   1.088512   -0.650942   -2.547450   -0.566858
2000-01-02   1.879182   -1.038796   -3.215581   -0.299575
2000-01-03   1.303660   -2.003821   -3.155154   -2.479355
2000-01-04   1.884801   -0.141119   -0.862400   -0.483331
2000-01-05   1.194699    0.010551    0.297378   -1.216695
2000-01-06   1.925393    1.968551   -0.968183    1.284044
2000-01-07   0.565208    0.032738   -2.125934    0.482797
2000-01-08   0.564129   -0.759118   -2.454374   -0.325454
2000-01-09   2.048458   -1.820537   -0.535232   -1.212381
2000-01-10   2.065750    0.383357    1.541496   -3.201469
2000-01-01   1.088512
2000-01-02   1.879182
2000-01-03   1.303660
2000-01-04   1.884801
2000-01-05   1.194699
2000-01-06   1.925393
2000-01-07   0.565208
2000-01-08   0.564129
2000-01-09   2.048458
2000-01-10   2.065750
Freq: D, Name: A, dtype: float64

自定義結果

Pandas 允許您跨列聚合不同的函式並重命名結果 DataFrame 的索引。這可以透過將元組傳遞給agg() 函式來完成。

示例

以下示例使用自定義索引標籤應用聚合。

import pandas as pd
import numpy as np

df = pd.DataFrame([[1, 2, 3, 1],
                   [4, 5, 6, np.nan],
                   [7, 8, 9, 2],
                   [np.nan, 2, np.nan, 3]],
   index = pd.date_range('1/1/2024', periods=4),
   columns = ['A', 'B', 'C', 'D'])

print("Input DataFrame:\n",df)
result = df.agg(x=('A', 'max'), y=('B', 'min'), z=('C', 'mean'))
print("\nResults:\n",result)

輸出如下:

Input DataFrame:
               A  B    C    D
2024-01-01  1.0  2  3.0  1.0
2024-01-02  4.0  5  6.0  NaN
2024-01-03  7.0  8  9.0  2.0
2024-01-04  NaN  2  NaN  3.0

Results:
      A    B    C
x  7.0  NaN  NaN
y  NaN  2.0  NaN
z  NaN  NaN  6.0

在列上應用聚合

除了在行上進行聚合外,您還可以透過將 axis 引數設定為列 (axis=1) 在列上進行聚合。當您想跨行應用聚合函式時,這很有用。

示例

此示例跨列為每一行應用mean()函式。

import pandas as pd
import numpy as np

df = pd.DataFrame([[1, 2, 3, 1],
                   [4, 5, 6, np.nan],
                   [7, 8, 9, 2],
                   [np.nan, 2, np.nan, 3]],
   index = pd.date_range('1/1/2024', periods=4),
   columns = ['A', 'B', 'C', 'D'])

print("Input DataFrame:\n",df)
result = df.agg("mean", axis="columns")
print("\nResults:\n",result)

輸出如下:

Input DataFrame:
               A  B    C    D
2024-01-01  1.0  2  3.0  1.0
2024-01-02  4.0  5  6.0  NaN
2024-01-03  7.0  8  9.0  2.0
2024-01-04  NaN  2  NaN  3.0

Results:
 2024-01-01    1.75
2024-01-02    5.00
2024-01-03    6.50
2024-01-04    2.50
Freq: D, dtype: float64
廣告