5.1 GroupBy 操作


文档摘要

5.1 GroupBy 操作 Pandas GroupBy 操作详解 5.1 GroupBy 操作 GroupBy 操作是 Pandas 中最强大和灵活的数据分析工具之一。它允许你根据一个或多个列的值将 DataFrame 分组,然后对每个组执行聚合、转换或过滤操作。这种“拆分-应用-合并”策略是数据分析的核心,能够帮助我们从复杂的数据集中提取有意义的见解。 核心概念: 拆分 (Split): 将 DataFrame 按照指定的列(或多个列)的值进行分组,形成多个子 DataFrame。 应用 (Apply): 对每个子 DataFrame 应用一个函数。这个函数可以是聚合函数(如 、 、 ),转换函数(如标准化、填充缺失值),或过滤函数。

5.1 GroupBy 操作

Pandas GroupBy 操作详解

5.1 GroupBy 操作

GroupBy 操作是 Pandas 中最强大和灵活的数据分析工具之一。它允许你根据一个或多个列的值将 DataFrame 分组,然后对每个组执行聚合、转换或过滤操作。这种“拆分-应用-合并”策略是数据分析的核心,能够帮助我们从复杂的数据集中提取有意义的见解。

核心概念:

  • 拆分 (Split): 将 DataFrame 按照指定的列(或多个列)的值进行分组,形成多个子 DataFrame。

  • 应用 (Apply): 对每个子 DataFrame 应用一个函数。这个函数可以是聚合函数(如 summeancount),转换函数(如标准化、填充缺失值),或过滤函数。

  • 合并 (Combine): 将应用函数后的结果合并成一个新的 DataFrame。

5.1.1 GroupBy 的基本用法

使用 groupby() 方法创建 GroupBy 对象。最简单的用法是指定一个列名作为分组键:

import pandas as pd import numpy as np # 创建示例 DataFrame data = {'Team': ['A', 'A', 'B', 'B', 'B', 'C', 'C'], 'Player': ['P1', 'P2', 'P3', 'P4', 'P5', 'P6', 'P7'], 'Points': [10, 12, 15, 18, 20, 22, 25], 'Assists': [5, 7, 8, 9, 10, 11, 12]} df = pd.DataFrame(data) print("原始DataFrame:\n", df) # 根据 'Team' 列进行分组 grouped = df.groupby('Team') print("\nGroupBy对象:\n", grouped) # 输出: <pandas.core.groupby.generic.DataFrameGroupBy object at ...>

输出:

原始DataFrame: Team Player Points Assists 0 A P1 10 5 1 A P2 12 7 2 B P3 15 8 3 B P4 18 9 4 B P5 20 10 5 C P6 22 11 6 C P7 25 12 GroupBy对象: <pandas.core.groupby.generic.DataFrameGroupBy object at 0x...>

grouped 对象本身不是一个 DataFrame,而是一个 GroupBy 对象。要查看分组后的数据,可以使用循环或者应用聚合函数。

5.1.2 聚合 (Aggregation)

聚合是最常见的 GroupBy 操作。它将每个组中的多个值缩减为单个汇总值。Pandas 提供了多种内置的聚合函数,如 summeanmedianminmaxcountstdvar 等。

# 计算每个 Team 的总 Points total_points = grouped['Points'].sum() print("\n每个Team的总Points:\n", total_points) # 计算每个 Team 的平均 Points 和 Assists mean_values = grouped[['Points', 'Assists']].mean() # 注意这里传入的是列名列表 print("\n每个Team的平均Points和Assists:\n", mean_values) # 使用 agg() 方法应用多个聚合函数 agg_functions = {'Points': ['sum', 'mean', 'max'], 'Assists': ['sum', 'mean', 'max']} aggregated_data = grouped.agg(agg_functions) print("\n应用多个聚合函数:\n", aggregated_data)

输出:

每个Team的总Points: Team A 22 B 53 C 47 Name: Points, dtype: int64 每个Team的平均Points和Assists: Points Assists Team A 11.00 6.0 B 17.67 9.0 C 23.50 11.5 应用多个聚合函数: Points Assists sum mean max sum mean max Team A 22 11.0 12 12 6.0 7 B 53 17.6 20 27 9.0 10 C 47 23.5 25 23 11.5 12

agg() 方法允许你同时应用多个聚合函数,并且可以为不同的列指定不同的函数。 你也可以自定义聚合函数:

def range_func(x): return x.max() - x.min() range_points = grouped['Points'].agg(range_func) print("\n每个Team的Points范围:\n", range_points)

输出:

每个Team的Points范围: Team A 2 B 5 C 3 Name: Points, dtype: int64

5.1.3 转换 (Transformation)

转换操作对每个组中的每个值进行转换,并返回与原始 DataFrame 具有相同索引和形状的 DataFrame。常用的转换函数包括 标准化填充缺失值 等。

# 标准化每个 Team 的 Points def standardize(x): return (x - x.mean()) / x.std() standardized_points = grouped['Points'].transform(standardize) print("\n每个Team的标准化Points:\n", standardized_points)

输出:

每个Team的标准化Points: 0 -1.000000 1 1.000000 2 -1.000000 3 0.000000 4 1.000000 5 -1.000000 6 1.000000 Name: Points, dtype: float64

transform() 方法将 standardize 函数应用于每个 Team 的 Points,并返回一个与原始 DataFrame 具有相同索引的 Series。

5.1.4 过滤 (Filtering)

过滤操作根据组的属性来选择或排除整个组。可以使用 filter() 方法,该方法接受一个函数,该函数对每个组返回 TrueFalse

# 筛选出总 Points 大于 50 的 Team def filter_teams(x): return x['Points'].sum() > 50 filtered_teams = df.groupby('Team').filter(filter_teams) print("\n总Points大于50的Team的数据:\n", filtered_teams)

输出:

总Points大于50的Team的数据: Team Player Points Assists 2 B P3 15 8 3 B P4 18 9 4 B P5 20 10 5 C P6 22 11 6 C P7 25 12

filter() 方法将 filter_teams 函数应用于每个 Team,如果 Team 的总 Points 大于 50,则保留该 Team 的所有行。

5.1.5 多重分组

可以根据多个列进行分组,创建更精细的分组。

# 根据 'Team' 和 'Player' 列进行分组 multi_grouped = df.groupby(['Team', 'Player']) # 计算每个 Team 和 Player 组合的 Points 总和 multi_sum = multi_grouped['Points'].sum() print("\n每个Team和Player组合的Points总和:\n", multi_sum) # 将结果转换为 DataFrame multi_sum_df = multi_sum.reset_index() print("\n转换为DataFrame:\n", multi_sum_df)

输出:

每个Team和Player组合的Points总和: Team Player A P1 10 P2 12 B P3 15 P4 18 P5 20 C P6 22 P7 25 Name: Points, dtype: int64 转换为DataFrame: Team Player Points 0 A P1 10 1 A P2 12 2 B P3 15 3 B P4 18 4 B P5 20 5 C P6 22 6 C P7 25

5.1.6 apply() 方法

apply() 方法是一个通用的 GroupBy 操作,它允许你将任何函数应用于每个组。这提供了最大的灵活性,可以执行复杂的自定义操作。

# 定义一个函数,计算每个 Team 的 Points 的 Top N def top_n(df, column, n=2): return df.sort_values(by=column, ascending=False)[:n] # 使用 apply() 方法获取每个 Team 的 Points Top 2 top_2_points = df.groupby('Team').apply(top_n, column='Points', n=2) print("\n每个Team的Points Top 2:\n", top_2_points)

输出:

每个Team的Points Top 2: Team Player Points Assists 1 A P2 12 7 0 A P1 10 5 4 B P5 20 10 3 B P4 18 9 6 C P7 25 12 5 C P6 22 11

apply() 方法将 top_n 函数应用于每个 Team,并返回一个包含每个 Team 的 Points Top 2 的 DataFrame。

5.1.7 as_index 参数

默认情况下,groupby() 方法会将分组键设置为结果 DataFrame 的索引。可以使用 as_index=False 参数来避免这种情况。

# 不将 'Team' 列设置为索引 grouped_no_index = df.groupby('Team', as_index=False)['Points'].sum() print("\n不将'Team'列设置为索引:\n", grouped_no_index)

输出:

不将'Team'列设置为索引: Team Points 0 A 22 1 B 53 2 C 47

总结

GroupBy 操作是 Pandas 中进行数据聚合和分组的关键工具。通过拆分、应用和合并数据,可以轻松地执行各种数据分析任务。掌握 GroupBy 的基本用法、聚合、转换、过滤和 apply() 方法,将极大地提高数据分析的效率和能力。 通过灵活运用这些方法,可以从复杂的数据集中提取有价值的信息,为决策提供支持。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U