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
广告