6.1 分组聚合:groupby 基本用法
在数据分析的世界里,分组聚合就像是一把瑞士军刀——小巧但功能强大。想象一下你有一堆杂乱无章的数据,比如销售记录,你想知道每个地区的总销售额。这时候,groupby 就派上用场了!它能帮你把数据按照某个(或某些)列进行分组,然后对每一组应用特定的函数。
核心思想:split-apply-combine(拆分-应用-合并)。首先将数据集拆分成多个小组,接着对每个小组应用一个函数,最后把结果合并成一个新的数据结构。
实例方法表格
| 功能名称 | 实例调用方法 | 具体功能、注意事项、必需参数/可选参数 |
|---|---|---|
| 创建分组对象 | df.groupby('column_name') | 按照指定列名对DataFrame进行分组;必需参数为要分组的列名 |
| 查看分组信息 | grouped.groups | 返回一个字典,键是分组标签,值是对应行索引列表 |
| 获取特定组 | grouped.get_group('group_label') | 获取特定标签对应的组数据;必需参数为具体的分组标签 |
# 导入必要的库
import pandas as pd # 数据处理神器pandas
# 创建示例数据
data = {
'Region': ['North', 'South', 'North', 'South', 'East'],
'Sales': [200, 150, 300, 250, 400]
}
df = pd.DataFrame(data) # 将字典转换为DataFrame
try:
# 使用groupby按'Region'列分组
grouped = df.groupby('Region') # 创建分组对象
# 打印所有分组的信息
print("分组信息:", grouped.groups) # 显示每个分组包含哪些行索引
# 获取'North'区域的数据
north_data = grouped.get_group('North') # 提取特定分组的数据
print("\nNorth区域数据:\n", north_data)
except KeyError as e:
print(f"错误: 列名不存在 - {e}") # 处理列名不存在的情况
except Exception as e:
print(f"发生未知错误: {e}") # 捕获其他可能的异常这段代码展示了如何使用 groupby 进行基本的分组操作。通过这种方式,你可以轻松地对不同类别的数据进行独立分析。记住,分组只是第一步,真正的魔法在于后续的聚合操作!
这节主要介绍了 groupby 的基本概念和使用方法,它是进行高效数据分析的基础工具之一,能够帮助我们快速从复杂数据中提取有价值的信息。
6.2 聚合函数:sum、mean、count、agg
当你已经掌握了分组的基本技能后,下一步就是学习如何对这些分组进行有意义的计算。聚合函数就像是你的私人助理,它们可以自动帮你完成各种统计任务,比如求和、平均值、计数等等。
实例方法表格
| 功能名称 | 实例调用方法 | 具体功能、注意事项、必需参数/可选参数 |
|---|---|---|
| 求和 | grouped.sum() | 对每组数值型数据求和;无需额外参数 |
| 平均值 | grouped.mean() | 计算每组数值型数据的平均值;自动忽略非数值类型 |
| 计数 | grouped.count() | 统计每组非空值的数量;适用于所有数据类型 |
| 自定义聚合 | grouped.agg({'col1': 'sum', 'col2': 'mean'}) | 对不同列应用不同的聚合函数;必需参数为字典形式的函数映射 |
# 继续使用之前的示例数据
# 假设我们已经有了分组对象grouped
try:
# 对Sales列进行求和
total_sales = grouped['Sales'].sum() # 计算每个区域的总销售额
print("各区域总销售额:\n", total_sales)
# 计算平均销售额
avg_sales = grouped['Sales'].mean() # 计算每个区域的平均销售额
print("\n各区域平均销售额:\n", avg_sales)
# 统计每个区域的记录数量
region_counts = grouped.size() # 统计每个区域有多少条记录
print("\n各区域记录数量:\n", region_counts)
# 应用多个聚合函数
multi_agg = grouped['Sales'].agg(['sum', 'mean', 'count']) # 同时计算总和、平均值和计数
print("\n多重聚合结果:\n", multi_agg)
except AttributeError as e:
print(f"错误: 数据列不支持该操作 - {e}") # 处理不支持的操作
except Exception as e:
print(f"发生未知错误: {e}") # 捕获其他可能的异常这里展示了几种常用的聚合函数及其组合使用方式。通过这些简单的命令,你就能获得丰富的统计数据,而不需要手动编写复杂的循环逻辑。
这节讲解了如何利用聚合函数对分组后的数据进行深入分析,这些函数极大地简化了数据分析过程,使你能专注于业务洞察而非繁琐的计算细节。
6.3 多级分组与分组后过滤
有时候,单一层级的分组并不能满足我们的需求。比如,在分析销售数据时,你可能不仅想按地区分组,还想进一步按产品类别细分。这时就需要用到多级分组了。此外,分组之后往往还需要根据某些条件筛选出感兴趣的组,这就涉及到分组后的过滤操作。
实例方法表格
| 功能名称 | 实例调用方法 | 具体功能、注意事项、必需参数/可选参数 |
|---|---|---|
| 多级分组 | df.groupby(['col1', 'col2']) | 按照多个列同时进行分组;必需参数为包含多个列名的列表 |
| 分组过滤 | grouped.filter(lambda x: x['Sales'].sum() > threshold) | 根据自定义条件过滤分组;必需参数为返回布尔值的函数 |
| 分组转换 | grouped.transform(lambda x: (x - x.mean()) / x.std()) | 对每组数据进行标准化等变换;必需参数为应用于每组的函数 |
# 扩展示例数据以包含更多维度
extended_data = {
'Region': ['North', 'South', 'North', 'South', 'East', 'East'],
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Sales': [200, 150, 300, 250, 400, 350]
}
df_extended = pd.DataFrame(extended_data)
try:
# 多级分组:先按Region再按Category
multi_grouped = df_extended.groupby(['Region', 'Category']) # 创建多级分组对象
# 查看多级分组的结果
print("多级分组总销售额:\n", multi_grouped['Sales'].sum())
# 分组过滤:只保留总销售额大于300的组
filtered_groups = multi_grouped.filter(lambda x: x['Sales'].sum() > 300) # 过滤符合条件的组
print("\n过滤后的数据:\n", filtered_groups)
# 分组转换:对Sales列进行标准化
standardized_sales = multi_grouped['Sales'].transform(lambda x: (x - x.mean()) / x.std()) # 标准化处理
print("\n标准化后的Sales:\n", standardized_sales)
except ValueError as e:
print(f"错误: 数据格式问题 - {e}") # 处理数据格式相关的问题
except Exception as e:
print(f"发生未知错误: {e}") # 捕获其他可能的异常多级分组让你能够更精细地切分数据,而分组过滤则帮助你聚焦于真正重要的部分。结合使用这两种技术,可以大大提升数据分析的效率和准确性。
这节介绍了多级分组和分组后过滤的技术,它们使得数据分析更加灵活和精准,特别是在面对复杂数据结构时显得尤为重要。
6.4 透视表(pivot_table)创建与解读
如果说 groupby 是数据分析中的瑞士军刀,那么透视表(pivot_table)就是它的豪华升级版。透视表不仅能实现分组聚合的功能,还能以更加直观的方式呈现结果,特别适合用来制作报表或者进行交互式探索。
实例方法表格
| 功能名称 | 实例调用方法 | 具体功能、注意事项、必需参数/可选参数 |
|---|---|---|
| 创建透视表 | pd.pivot_table(df, values='val_col', index='idx_col', columns='col_col', aggfunc='mean') | 必需参数包括数据框、值列、行索引列、列索引列以及聚合函数 |
| 处理缺失值 | fill_value=0 | 在创建透视表时填充NaN值;可选参数,默认为None |
| 边际总计 | margins=True | 添加行和列的总计;可选参数,默认为False |
# 使用扩展后的数据创建透视表
try:
# 创建透视表:行是Region,列是Category,值是Sales的平均值
pivot = pd.pivot_table(
df_extended,
values='Sales',
index='Region',
columns='Category',
aggfunc='mean',
fill_value=0, # 将缺失值替换为0
margins=True # 添加总计行和列
)
print("透视表:\n", pivot)
# 解读透视表:查看特定单元格的值
north_a_avg = pivot.loc['North', 'A'] # 获取North地区A类产品的平均销售额
print(f"\nNorth地区A类产品平均销售额: {north_a_avg}")
except KeyError as e:
print(f"错误: 列名不存在 - {e}") # 处理列名不存在的情况
except Exception as e:
print(f"发生未知错误: {e}") # 捕获其他可能的异常透视表的强大之处在于其灵活性和可视化效果。通过调整参数,你可以轻松生成各种维度的汇总表,并且很容易发现数据中的模式和趋势。
这节详细讲解了如何创建和解读透视表,这种工具非常适合用于生成易于理解的汇总报告,同时也是探索性数据分析的重要手段。