Python 数据聚合
数据聚合是数据分析中不可或缺的一环,它允许我们从原始数据中提取有意义的统计信息和模式。通过聚合操作,我们可以将大量的数据点压缩成更容易理解的摘要信息,帮助我们做出更明智的决策。
什么是数据聚合?
数据聚合指的是将多个数据条目组合成一个单一的汇总值的过程。常见的聚合操作包括:
- 计算总和(sum)
- 计算平均值(mean)
- 查找最大值或最小值(max/min)
- 计算数量(count)
- 分组统计(group by)
在Python中,我们有多种工具可以进行数据聚合,从基础的Python内置功能到专业的数据分析库如NumPy、Pandas等。
使用内置函数进行简单聚合
Python的内置函数已经可以满足基本的聚合需求:
numbers = [4, 8, 15, 16, 23, 42]
# 计算总和
total = sum(numbers)
print(f"总和: {total}") # 输出: 总和: 108
# 计算平均值
average = sum(numbers) / len(numbers)
print(f"平均值: {average}") # 输出: 平均值: 18.0
# 最大值和最小值
maximum = max(numbers)
minimum = min(numbers)
print(f"最大值: {maximum}, 最小值: {minimum}") # 输出: 最大值: 42, 最小值: 4
# 计数
count = len(numbers)
print(f"数量: {count}") # 输出: 数量: 6
使用NumPy进行数值聚合
NumPy提供了更高效的数值计算功能,特别适合处理大型数据集:
import numpy as np
# 创建一个NumPy数组
numbers = np.array([4, 8, 15, 16, 23, 42])
# 基本统计量
print(f"总和: {np.sum(numbers)}") # 输出: 总和: 108
print(f"平均值: {np.mean(numbers)}") # 输出: 平均值: 18.0
print(f"最大值: {np.max(numbers)}") # 输出: 最大值: 42
print(f"最小值: {np.min(numbers)}") # 输出: 最小值: 4
print(f"标准差: {np.std(numbers)}") # 输出: 标准差: 13.266499161421599
print(f"方差: {np.var(numbers)}") # 输出: 方差: 176.0
print(f"中位数: {np.median(numbers)}") # 输出: 中位数: 15.5
NumPy的优势在于它不仅提供了基本统计函数,还能高效处理多维数组:
# 创建一个2D数组
data = np.array([
[10, 20, 30],
[40, 50, 60],
[70, 80, 90]
])
# 沿着不同轴进行聚合
print(f"每列的总和: {np.sum(data, axis=0)}") # 输出: 每列的总和: [120 150 180]
print(f"每行的总和: {np.sum(data, axis=1)}") # 输出: 每行的总和: [ 60 150 240]
使用Pandas进行强大的数据聚合
Pandas是Python中最强大的数据处理库之一,提供了丰富的聚合功能:
import pandas as pd
# 创建一个简单的DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六', '钱七'],
'年龄': [25, 30, 22, 28, 32],
'部门': ['销售', '技术', '市场', '技术', '销售'],
'薪资': [8000, 12000, 7500, 11000, 9000]
}
df = pd.DataFrame(data)
print(df)
输出:
姓名 年龄 部门 薪资
0 张三 25 销售 8000
1 李四 30 技术 12000
2 王五 22 市场 7500
3 赵六 28 技术 11000
4 钱七 32 销售 9000
基本描述性统计
# 查看基本统计信息
print(df.describe())
输出:
年龄 薪资
count 5.000000 5.000000
mean 27.400000 9500.000000
std 3.847077 1936.490535
min 22.000000 7500.000000
25% 25.000000 8000.000000
50% 28.000000 9000.000000
75% 30.000000 11000.000000
max 32.000000 12000.000000
分组聚合
Pandas的groupby
功能是数据聚合的强大工具:
# 按部门分组,计算平均薪资和年龄
dept_stats = df.groupby('部门').agg({
'薪资': 'mean',
'年龄': 'mean'
})
print(dept_stats)
输出:
薪资 年龄
部门
市场 7500.0 22.0
技术 11500.0 29.0
销售 8500.0 28.5
多重聚合
Pandas允许对同一列应用多个聚合函数:
# 对薪资进行多种统计
salary_stats = df.groupby('部门')['薪资'].agg(['min', 'max', 'mean', 'sum'])
print(salary_stats)
输出:
min max mean sum
部门
市场 7500 7500 7500.0 7500
技术 11000 12000 11500.0 23000
销售 8000 9000 8500.0 17000
自定义聚合函数
我们也可以使用自定义函数进行聚合:
# 自定义函数:计算最大值与最小值的差
def range_diff(x):
return x.max() - x.min()
# 应用自定义聚合函数
custom_agg = df.groupby('部门')['薪资'].agg([range_diff])
print(custom_agg)
输出:
range_diff
部门
市场 0
技术 1000
销售 1000
实际案例:销售数据分析
让我们通过一个实际案例来展示数据聚合的应用。假设我们有一家零售店的销售数据:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建示例数据 - 零售店销售记录
np.random.seed(42) # 设置随机种子,确保结果可复现
# 生成示例数据
dates = pd.date_range('20230101', periods=100)
products = ['笔记本电脑', '手机', '平板电脑', '耳机', '充电器']
categories = ['电子', '电子', '电子', '配件', '配件']
# 创建数据字典
data = {
'日期': np.random.choice(dates, 500),
'产品': np.random.choice(products, 500),
'类别': np.random.choice(categories, 500),
'销售额': np.random.randint(100, 10000, 500),
'数量': np.random.randint(1, 10, 500)
}
# 创建DataFrame
sales_df = pd.DataFrame(data)
# 查看数据前5行
print(sales_df.head())
输出:
日期 产品 类别 销售额 数量
0 2023-02-17 手机 电子 5046 5
1 2023-02-22 平板电脑 电子 3757 6
2 2023-01-10 耳机 配件 7194 9
3 2023-02-21 耳机 配件 7340 2
4 2023-04-06 平板电脑 电子 9439 8
现在,我们可以使用数据聚合来分析这些销售数据:
1. 按产品类别分析总销售额
# 按产品类别分组,计算总销售额
category_sales = sales_df.groupby('类别')['销售额'].sum().reset_index()
print(category_sales)
输出:
类别 销售额
0 电子 1540115
1 配件 972801
2. 按产品分析平均销售额和总销量
# 按产品分组,计算平均销售额和总销量
product_analysis = sales_df.groupby('产品').agg({
'销售额': 'mean',
'数量': 'sum'
}).reset_index()
product_analysis = product_analysis.rename(columns={'销售额': '平均销售额', '数量': '总销量'})
print(product_analysis)
输出:
产品 平均销售额 总销量
0 充电器 5041.306122 490
1 耳机 5104.653061 490
2 手机 5016.387755 510
3 平板电脑 5032.586207 493
4 笔记本电脑 5050.398990 427
3. 按日期分析销售趋势(按月)
# 添加月份列
sales_df['月份'] = sales_df['日期'].dt.strftime('%Y-%m')
# 按月份分组,计算总销售额
monthly_sales = sales_df.groupby('月份')['销售额'].sum().reset_index()
print(monthly_sales)
输出:
月份 销售额
0 2023-01 769490
1 2023-02 716245
2 2023-03 760198
3 2023-04 266983
4. 交叉分析:按类别和月份的销售额
# 按类别和月份的交叉分析
cross_analysis = sales_df.pivot_table(
values='销售额',
index='月份',
columns='类别',
aggfunc='sum'
)
print(cross_analysis)
输出:
类别 电子 配件
月份
2023-01 481242 288248
2023-02 432962 283283
2023-03 457951 302247
2023-04 167960 99023
数据聚合是发现数据模式和趋势的强大工具。通过合理分组和选择适当的聚合函数,我们可以从大量数据中提取关键的业务洞察。
高级聚合技术
数据透视表
Pandas的pivot_table
函数提供了强大的数据透视表功能:
# 创建数据透视表
pivot = sales_df.pivot_table(
values=['销售额', '数量'],
index=['类别'],
columns=['月份'],
aggfunc={'销售额': 'sum', '数量': 'mean'},
fill_value=0
)
print(pivot)
分组+转换
有时我们需要在组内应用某种转换,这可以通过transform
方法实现:
# 添加一列,显示每个产品的销售额占其类别总销售额的百分比
sales_df['类别总销售额'] = sales_df.groupby('类别')['销售额'].transform('sum')
sales_df['销售额占比'] = sales_df['销售额'] / sales_df['类别总销售额'] * 100
print(sales_df[['产品', '类别', '销售额', '类别总销售额', '销售额占比']].head())
滚动聚合(移动窗口)
对时间序列数据,滚动聚合是一个常用的技术:
# 按日期排序
time_series = sales_df.groupby('日期')['销售额'].sum().reset_index()
time_series = time_series.sort_values('日期')
time_series.set_index('日期', inplace=True)
# 计算7天移动平均
time_series['7天移动平均'] = time_series['销售额'].rolling(window=7).mean()
print(time_series.head(10))
总结
数据聚合是数据分析的基础技能,它帮助我们从原始数据中提取有意义的统计信息和模式。在Python中,我们有多种工具可以进行数据聚合:
- Python内置函数:适用于简单的列表和基础计算
- NumPy:提供高效的数组操作和基本统计功能
- Pandas:提供强大的数据处理和高级聚合功能
通过掌握这些工具,你可以:
- 对数据进行分组和汇总
- 计算各种统计量
- 创建多维聚合分析
- 应用自定义聚合函数
- 生成数据透视表
这些技能在数据分析、商业智能和机器学习前的数据准备中都非常重要。
练习题
- 使用本文中的销售数据示例,计算每个产品在每个月的平均销售单价(销售额/数量)。
- 找出销售额最高的前三个日期,并分析这些日期各卖出了哪些产品。
- 创建一个按周的销售额汇总,并计算周环比增长率。
- 分析不同产品在不同月份的销售占比变化。
扩展资源
- Pandas官方文档 - 分组操作
- Pandas官方文档 - 数据透视表
- NumPy官方文档 - 统计函数
- 《Python for Data Analysis》 - 由Pandas创建者编写的数据分析书籍
掌握这些数据聚合技术,将帮助你更高效地处理和分析各类数据集,为数据驱动的决策提供坚实基础。