告别复杂数据分析!Pandas Groupby 一键搞定 – wiki基地

告别复杂数据分析!Pandas Groupby 一键搞定

在数据分析的浩瀚海洋中,我们常常面临着需要从大量数据中提取有用信息、洞察规律的挑战。而这些数据往往并非整齐划一,而是按照不同的类别、属性分布。如果没有高效的数据处理工具,我们将深陷于繁琐的循环、条件判断之中,事倍功半。幸运的是,Pandas 库为我们提供了强大的 Groupby 功能,能够以简洁高效的方式实现数据的分组聚合,极大地简化了数据分析流程。本文将深入探讨 Pandas Groupby 的强大功能,并结合实际案例,帮助你掌握其使用技巧,告别复杂数据分析,实现数据洞察的飞跃。

一、什么是 Groupby?为什么要使用它?

Groupby,顾名思义,就是将数据按照一定的规则进行分组。在 Pandas 中,Groupby 操作涉及到三个主要步骤:

  1. Split (分割): 按照指定的列或多个列,将 DataFrame 分割成多个组。每个组包含具有相同分组值的行。
  2. Apply (应用): 对每个组应用一个函数,执行聚合、转换或过滤等操作。
  3. Combine (组合): 将应用函数后的结果重新组合成一个新的 DataFrame。

为什么我们需要 Groupby? 想象一下你有一个销售数据表,包含了不同地区的销售额。你想知道每个地区的总销售额是多少。如果没有 Groupby,你可能需要编写循环来遍历整个表格,然后根据地区累加销售额。这不仅耗时耗力,而且代码可读性差,容易出错。

使用 Groupby,你只需一行代码就能完成这个任务:

“`python
import pandas as pd

假设 sales_data 是一个 DataFrame,包含 ‘region’ 和 ‘sales’ 两列

grouped_sales = sales_data.groupby(‘region’)[‘sales’].sum()
print(grouped_sales)
“`

这段代码首先使用 groupby('region') 将数据按照 ‘region’ 列进行分组。然后,它选择 ‘sales’ 列,并使用 .sum() 函数计算每个组的销售额总和。最后,将结果存储在 grouped_sales 中,这是一个 Series,其索引是地区名称,值是对应的销售额总和。

从这个简单的例子可以看出,Groupby 的优势在于:

  • 简化代码: 用几行代码就能完成复杂的数据聚合操作。
  • 提高效率: Pandas 内部优化了 Groupby 操作,使其运行速度更快。
  • 增强可读性: 代码结构清晰,易于理解和维护。

二、Groupby 的基本用法

在使用 Groupby 之前,我们需要先创建一个 DataFrame 作为示例。以下代码创建了一个包含员工信息的数据集:

“`python
import pandas as pd

data = {‘部门’: [‘研发部’, ‘销售部’, ‘研发部’, ‘销售部’, ‘市场部’, ‘研发部’, ‘市场部’, ‘销售部’],
‘姓名’: [‘张三’, ‘李四’, ‘王五’, ‘赵六’, ‘钱七’, ‘孙八’, ‘周九’, ‘吴十’],
‘年龄’: [30, 28, 35, 32, 27, 40, 31, 29],
‘工资’: [8000, 7000, 9000, 7500, 6500, 10000, 7200, 8200],
‘绩效’: [‘优秀’, ‘良好’, ‘优秀’, ‘良好’, ‘合格’, ‘卓越’, ‘良好’, ‘优秀’]}

df = pd.DataFrame(data)
print(df)
“`

这个 DataFrame 包含了员工的部门、姓名、年龄、工资和绩效信息。接下来,我们将使用 Groupby 来分析这些数据。

1. 按照单列进行分组

最简单的 Groupby 用法是按照单列进行分组。例如,我们可以按照 ‘部门’ 列进行分组:

python
grouped_by_department = df.groupby('部门')
print(grouped_by_department)

这段代码创建了一个 DataFrameGroupBy 对象,它表示按照 ‘部门’ 列分组后的数据。 DataFrameGroupBy 对象本身并不会立即计算结果,它只是一种中间状态,只有当我们对其应用聚合函数时,才会真正执行计算。

2. 常用的聚合函数

Groupby 对象可以应用多种聚合函数,例如:

  • sum(): 求和
  • mean(): 求平均值
  • median(): 求中位数
  • min(): 求最小值
  • max(): 求最大值
  • count(): 计数
  • std(): 求标准差
  • var(): 求方差

我们可以使用这些聚合函数来计算每个部门的工资总和、平均年龄等:

“`python

计算每个部门的工资总和

department_salary_sum = df.groupby(‘部门’)[‘工资’].sum()
print(“每个部门的工资总和:\n”, department_salary_sum)

计算每个部门的平均年龄

department_average_age = df.groupby(‘部门’)[‘年龄’].mean()
print(“\n每个部门的平均年龄:\n”, department_average_age)

计算每个部门的员工数量

department_employee_count = df.groupby(‘部门’)[‘姓名’].count() #可以使用任意列来计数
print(“\n每个部门的员工数量:\n”, department_employee_count)
“`

这些代码分别计算了每个部门的工资总和、平均年龄和员工数量。注意,我们在 groupby() 方法后面使用了 ['工资']['年龄'] 来选择要聚合的列。如果不指定列,则会对所有数值类型的列进行聚合。

3. 按照多列进行分组

Groupby 还可以按照多列进行分组。例如,我们可以按照 ‘部门’ 和 ‘绩效’ 两列进行分组,然后计算每个部门每个绩效级别的工资平均值:

python
department_performance_salary = df.groupby(['部门', '绩效'])['工资'].mean()
print("每个部门每个绩效级别的平均工资:\n", department_performance_salary)

这段代码首先按照 ‘部门’ 列进行分组,然后在每个部门内部再按照 ‘绩效’ 列进行分组。最后,计算每个部门每个绩效级别的工资平均值。 结果将是一个 MultiIndex Series,其索引是 ‘部门’ 和 ‘绩效’ 的组合。

4. 自定义聚合函数

除了内置的聚合函数外,我们还可以自定义聚合函数。例如,我们可以定义一个函数来计算每个部门工资超过 8000 的员工数量:

“`python
def count_high_salary(x):
return (x > 8000).sum()

department_high_salary_count = df.groupby(‘部门’)[‘工资’].agg(count_high_salary)
print(“每个部门工资超过8000的员工数量:\n”, department_high_salary_count)
“`

这段代码首先定义了一个名为 count_high_salary 的函数,该函数接收一个 Series 作为输入,并返回工资超过 8000 的员工数量。然后,我们使用 agg() 方法将该函数应用到每个部门的工资数据上。agg() 方法可以接受单个函数或函数列表,用于执行自定义的聚合操作。

三、Groupby 的高级应用

除了基本用法外,Groupby 还有一些高级应用,可以满足更复杂的数据分析需求。

1. 使用 agg() 方法进行多重聚合

agg() 方法可以接受多个聚合函数,用于一次性计算多个聚合指标。例如,我们可以同时计算每个部门的工资总和、平均值和标准差:

python
department_salary_summary = df.groupby('部门')['工资'].agg(['sum', 'mean', 'std'])
print("每个部门的工资总和、平均值和标准差:\n", department_salary_summary)

这段代码使用 agg(['sum', 'mean', 'std']) 一次性计算了每个部门的工资总和、平均值和标准差。 结果是一个 DataFrame,其列名是聚合函数的名称。

2. 使用 transform() 方法进行数据转换

transform() 方法可以将函数应用于每个组,并将结果广播到原始 DataFrame 的形状。 这可以用于计算每个组的统计指标,并将这些指标添加到原始 DataFrame 中。 例如,我们可以计算每个员工的工资在其所在部门的工资中所占的比例:

python
df['部门工资占比'] = df.groupby('部门')['工资'].transform(lambda x: x / x.sum())
print(df)

这段代码首先使用 groupby('部门')['工资'].transform(lambda x: x / x.sum()) 计算每个员工的工资在其所在部门的工资中所占的比例。 然后,将结果添加到原始 DataFrame 的 ‘部门工资占比’ 列中。

3. 使用 filter() 方法进行数据过滤

filter() 方法可以根据组的属性过滤掉某些组。 例如,我们可以过滤掉员工数量少于 3 人的部门:

python
filtered_df = df.groupby('部门').filter(lambda x: len(x) >= 3)
print("员工数量不少于3人的部门:\n", filtered_df)

这段代码使用 filter(lambda x: len(x) >= 3) 过滤掉员工数量少于 3 人的部门。 filter() 方法接受一个函数,该函数接收一个 DataFrame 作为输入,并返回一个布尔值,指示是否保留该组。

4. 处理缺失值

在使用 Groupby 时,我们需要注意处理缺失值。 默认情况下,Groupby 会忽略包含缺失值的行。 如果希望将缺失值也纳入考虑,可以使用 dropna=False 参数:

“`python

假设 df 中存在缺失值

df_with_na = df.copy()
df_with_na.loc[0, ‘工资’] = None

grouped_with_na = df_with_na.groupby(‘部门’, dropna=False)[‘工资’].sum()
print(“包含缺失值的分组结果:\n”, grouped_with_na)
“`

四、实际案例:分析电商平台的用户行为

假设我们有一个电商平台的用户行为数据集,包含了用户的 ID、购买日期、购买商品类别和购买金额等信息。我们可以使用 Groupby 来分析用户的购买行为,例如:

  • 统计每个用户购买的商品总金额
  • 计算每个商品类别的平均购买金额
  • 找出购买金额最高的 10 个用户
  • 分析不同时间段的用户购买行为

以下代码演示了如何使用 Groupby 来分析电商平台的用户行为:

“`python
import pandas as pd
import numpy as np

创建示例数据

np.random.seed(0)
num_users = 100
num_items = 20
start_date = pd.to_datetime(‘2023-01-01’)
end_date = pd.to_datetime(‘2023-01-31’)

data = {
‘用户ID’: np.random.randint(1, num_users + 1, size=1000),
‘购买日期’: pd.to_datetime(np.random.choice(pd.date_range(start_date, end_date), size=1000)),
‘商品类别’: np.random.choice([‘电子产品’, ‘服装’, ‘家居用品’, ‘食品’], size=1000),
‘购买金额’: np.random.uniform(10, 1000, size=1000)
}

df = pd.DataFrame(data)

统计每个用户购买的商品总金额

user_total_amount = df.groupby(‘用户ID’)[‘购买金额’].sum()
print(“每个用户购买的商品总金额:\n”, user_total_amount)

计算每个商品类别的平均购买金额

category_average_amount = df.groupby(‘商品类别’)[‘购买金额’].mean()
print(“\n每个商品类别的平均购买金额:\n”, category_average_amount)

找出购买金额最高的 10 个用户

top_10_users = user_total_amount.nlargest(10)
print(“\n购买金额最高的 10 个用户:\n”, top_10_users)

分析不同时间段的用户购买行为 (例如,按周统计)

df[‘周’] = df[‘购买日期’].dt.isocalendar().week
weekly_sales = df.groupby(‘周’)[‘购买金额’].sum()
print(“\n每周的销售额:\n”, weekly_sales)
“`

五、总结

Pandas Groupby 是一个功能强大的数据分析工具,可以帮助我们轻松地对数据进行分组、聚合、转换和过滤。 掌握 Groupby 的使用技巧,可以极大地简化数据分析流程,提高工作效率。 在实际应用中,我们可以根据具体的需求选择合适的 Groupby 方法和聚合函数,从而实现对数据的深入分析和洞察。 记住,练习是掌握 Groupby 的关键。 通过不断地练习和实践,你将能够熟练运用 Groupby,并将其应用于各种数据分析场景中。告别复杂数据分析,让 Pandas Groupby 成为你数据分析的得力助手!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部