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() 方法的结果取决于输入,如果使用单个函数,则返回 scalar 或 Series,如果应用多个函数,则返回 DataFrame。
对 DataFrame 行应用聚合
您可以使用 agg 函数对行(索引轴)应用多个函数。该方法将指定的聚合函数应用于 DataFrame 中的每一列。
示例
让我们创建一个 DataFrame,并对其应用聚合函数 sum 和 min。在本示例中,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 参数设置为 columns (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