第五章:数据聚合与分组


文档摘要

第五章:数据聚合与分组 第五章:Pandas 数据聚合与分组 数据聚合与分组是数据分析中至关重要的技术,它允许我们根据数据的特征将数据集拆分成更小的组,然后对这些组进行汇总计算,从而提取有价值的见解。Pandas 提供了强大的 方法来实现这些操作。 分组(Grouping) 方法是 Pandas 中分组操作的核心。它接受一个或多个列名作为参数,将 DataFrame 按照这些列的值进行分组。 基本语法: 代码示例: 输出: 返回一个 对象,它本身并不直接包含分组后的数据,而是包含了分组的信息。我们可以使用这个对象进行后续的聚合操作。 Mermaid 图示: 多列分组: 可以同时按照多个列进行分组,只需将列名放入一个列表即可。

第五章:数据聚合与分组

第五章:Pandas 数据聚合与分组

数据聚合与分组是数据分析中至关重要的技术,它允许我们根据数据的特征将数据集拆分成更小的组,然后对这些组进行汇总计算,从而提取有价值的见解。Pandas 提供了强大的 groupby() 方法来实现这些操作。

1. 分组(Grouping)

groupby() 方法是 Pandas 中分组操作的核心。它接受一个或多个列名作为参数,将 DataFrame 按照这些列的值进行分组。

基本语法:

df.groupby(by=column_name)

代码示例:

import pandas as pd # 创建示例 DataFrame data = {'Category': ['A', 'B', 'A', 'B', 'A', 'C'], 'Value': [10, 15, 12, 20, 18, 25], 'Sales': [100, 150, 120, 200, 180, 250]} df = pd.DataFrame(data) # 按照 'Category' 列进行分组 grouped = df.groupby('Category') # 查看分组后的对象 print(grouped)

输出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x...>

groupby() 返回一个 DataFrameGroupBy 对象,它本身并不直接包含分组后的数据,而是包含了分组的信息。我们可以使用这个对象进行后续的聚合操作。

Mermaid 图示:

多列分组:

可以同时按照多个列进行分组,只需将列名放入一个列表即可。

grouped = df.groupby(['Category', 'Value'])

2. 聚合(Aggregation)

聚合是指对分组后的数据进行汇总计算,例如求和、平均值、最大值、最小值等。Pandas 提供了多种聚合方法:

  • sum():求和

  • mean():平均值

  • median():中位数

  • min():最小值

  • max():最大值

  • count():计数

  • std():标准差

  • var():方差

代码示例:

# 对分组后的数据进行求和 sum_by_category = grouped.sum() print(sum_by_category) # 对分组后的数据计算平均值 mean_by_category = grouped.mean() print(mean_by_category)

输出:

Value Sales Category A 40 400 B 35 350 C 25 250 Value Sales Category A 13.333333 133.333333 B 17.500000 175.000000 C 25.000000 250.000000

使用 agg() 方法进行更灵活的聚合:

agg() 方法允许我们同时应用多个聚合函数,并可以自定义聚合函数的名称。

# 使用 agg() 方法进行聚合 aggregated = grouped.agg({ 'Value': ['sum', 'mean'], 'Sales': 'max' }) print(aggregated)

输出:

Value Sales sum mean max Category A 40 13.333333 180 B 35 17.500000 200 C 25 25.000000 250

自定义聚合函数:

可以使用 lambda 表达式或自定义函数作为 agg() 方法的参数。

# 自定义聚合函数 def range_func(x): return x.max() - x.min() aggregated = grouped.agg({ 'Value': ['sum', 'mean', range_func], 'Sales': 'max' }) print(aggregated)

3. 转换(Transformation)

转换是指对分组后的数据进行逐行操作,并将结果返回到与原始 DataFrame 具有相同索引的新 DataFrame 中。transform() 方法用于执行转换操作。

代码示例:

# 计算每个值在其所属组内的平均值 df['Mean_Value_By_Category'] = grouped['Value'].transform('mean') print(df)

输出:

Category Value Sales Mean_Value_By_Category 0 A 10 100 13.333333 1 B 15 150 17.500000 2 A 12 120 13.333333 3 B 20 200 17.500000 4 A 18 180 13.333333 5 C 25 250 25.000000

Mermaid 图示:

4. 过滤(Filtering)

过滤是指根据分组后的数据特征筛选出满足特定条件的组。filter() 方法用于执行过滤操作。

代码示例:

# 筛选出总销售额大于 300 的组 filtered = grouped.filter(lambda x: x['Sales'].sum() > 300) print(filtered)

输出:

Category Value Sales 0 A 10 100 2 A 12 120 4 A 18 180 1 B 15 150 3 B 20 200

Mermaid 图示:

5. 应用自定义函数

apply() 方法允许我们对每个分组应用自定义函数,该函数可以执行更复杂的操作。

代码示例:

# 自定义函数,计算每个组的 Value 的标准差和平均值之差 def custom_func(x): return x['Value'].std() - x['Value'].mean() applied = grouped.apply(custom_func) print(applied)

输出:

Category A -0.666667 B 0.750000 C NaN dtype: float64

6. pivot_table 进行数据透视

pivot_table 是一个强大的工具,可以基于分组对数据进行重塑和聚合,生成类似电子表格的数据透视表。

基本语法:

pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)
  • data: 要进行透视的 DataFrame。

  • values: 要聚合的列(数值列)。

  • index: 用于分组的行索引列。

  • columns: 用于分组的列索引列。

  • aggfunc: 聚合函数(默认为 'mean')。

  • fill_value: 缺失值填充值。

  • margins: 是否添加行/列总计。

代码示例:

import pandas as pd import numpy as np # 创建示例 DataFrame data = {'Category': ['A', 'A', 'B', 'B', 'C', 'C'], 'Subcategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'], 'Value': [10, 15, 12, 20, 18, 25], 'Sales': [100, 150, 120, 200, 180, 250]} df = pd.DataFrame(data) # 创建透视表 pivot_table = pd.pivot_table(df, values='Sales', index='Category', columns='Subcategory', aggfunc=np.sum, margins=True, margins_name='Total') print(pivot_table)

输出:

Subcategory X Y Total Category A 100 150 250 B 120 200 320 C 180 250 430 Total 400 600 1000

7. crosstab 进行交叉表分析

crosstab 用于计算两个或多个因子之间的频率表,可以方便地进行分类变量的交叉分析。

基本语法:

pd.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)
  • index: 用于分组的行索引列。

  • columns: 用于分组的列索引列。

  • values: 用于聚合的列(可选)。

  • aggfunc: 聚合函数(如果 values 不为 None)。

  • margins: 是否添加行/列总计。

  • normalize: 是否进行标准化。

代码示例:

import pandas as pd # 创建示例 DataFrame data = {'Gender': ['Male', 'Female', 'Male', 'Female', 'Male', 'Female'], 'Smoker': ['Yes', 'No', 'No', 'Yes', 'Yes', 'No']} df = pd.DataFrame(data) # 创建交叉表 cross_table = pd.crosstab(df['Gender'], df['Smoker'], margins=True, margins_name='Total') print(cross_table)

输出:

Smoker No Yes Total Gender Female 1 1 2 Male 1 2 3 Total 2 3 5

8. 总结

数据聚合与分组是 Pandas 中非常重要的功能,可以帮助我们从复杂的数据集中提取有意义的信息。groupby() 方法是分组的核心,而 agg()transform()filter()apply() 方法则提供了丰富的聚合、转换和过滤操作。 此外,pivot_tablecrosstab 方法能方便的进行数据透视和交叉表分析。 掌握这些技术对于数据分析师来说至关重要。 通过灵活运用这些方法,我们可以更深入地理解数据,发现隐藏的模式和趋势,并做出更明智的决策。


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