本文目录导读:

我来详细说明如何使用Pandas进行数据分组和扩展操作。
基础数据准备
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'部门': ['销售部', '销售部', '技术部', '技术部', '市场部', '市场部', '销售部'],
'区域': ['华东', '华北', '华东', '华南', '华东', '华北', '华东'],
'员工': ['张三', '李四', '王五', '赵六', '孙七', '周八', '吴九'],
'销售额': [100, 150, 200, 180, 120, 90, 160],
'年龄': [25, 32, 28, 35, 30, 27, 33]
})
print("原始数据:")
print(df)
基础分组操作
# 1. 基本分组聚合
print("按部门分组,计算销售额总和:")
result = df.groupby('部门')['销售额'].sum()
print(result)
# 2. 多列分组
print("\n按部门和区域分组,计算销售额均值:")
result = df.groupby(['部门', '区域'])['销售额'].mean()
print(result)
# 3. 多个聚合函数
print("\n按部门分组,多个聚合函数:")
result = df.groupby('部门')['销售额'].agg(['sum', 'mean', 'max', 'min', 'count'])
print(result)
分组扩展操作
1 transform() 方法
# 1. 计算每个部门的销售额占比
df['部门销售占比'] = df.groupby('部门')['销售额'].transform(lambda x: x / x.sum() * 100)
print("销售额占比:")
print(df[['部门', '员工', '销售额', '部门销售占比']])
# 2. 标准化处理
df['销售额标准化'] = df.groupby('部门')['销售额'].transform(
lambda x: (x - x.mean()) / x.std()
)
print("\n销售额标准化:")
print(df[['部门', '员工', '销售额', '销售额标准化']])
2 apply() 方法
# 1. 自定义分析函数
def analyze_dept(group):
return pd.Series({
'员工数': len(group),
'平均销售额': group['销售额'].mean(),
'最高销售额': group['销售额'].max(),
'平均年龄': group['年龄'].mean()
})
print("部门分析:")
result = df.groupby('部门').apply(analyze_dept)
print(result)
# 2. 排名
df['销售额排名'] = df.groupby('部门')['销售额'].rank(ascending=False)
print("\n部门内销售额排名:")
print(df[['部门', '员工', '销售额', '销售额排名']])
高级分组扩展案例
案例1:客户RFM分析
# 创建模拟客户数据
np.random.seed(42)
n = 100
customer_data = pd.DataFrame({
'客户ID': [f'C{str(i).zfill(3)}' for i in range(1, n+1)],
'消费金额': np.random.randint(100, 5000, n),
'消费频率': np.random.randint(1, 20, n),
'最近消费天数': np.random.randint(1, 365, n),
'会员等级': np.random.choice(['金卡', '银卡', '铜卡'], n, p=[0.2, 0.3, 0.5])
})
# 按会员等级分组分析
def rfm_analysis(group):
return pd.Series({
'客户数': len(group),
'平均消费金额': group['消费金额'].mean(),
'平均消费频率': group['消费频率'].mean(),
'平均最近消费天数': group['最近消费天数'].mean(),
'总消费金额': group['消费金额'].sum()
})
print("RFM分析结果:")
rfm_result = customer_data.groupby('会员等级').apply(rfm_analysis)
print(rfm_result)
# 添加百分比
rfm_result['客户占比'] = rfm_result['客户数'] / rfm_result['客户数'].sum() * 100
print("\n包含占比的分析结果:")
print(rfm_result)
案例2:时间序列分组扩展
# 创建时间序列数据
dates = pd.date_range('2024-01-01', '2024-12-31', freq='D')
sales_data = pd.DataFrame({
'日期': dates * 2,
'产品': ['A'] * 365 + ['B'] * 365,
'销量': np.random.randint(10, 100, 730)
})
# 按月分组统计
sales_data['月份'] = sales_data['日期'].dt.month
sales_data['季度'] = sales_data['日期'].dt.quarter
# 按月度和产品分组
monthly_stats = sales_data.groupby(['月份', '产品'])['销量'].agg(['sum', 'mean', 'std'])
print("月度销售统计:")
print(monthly_stats.head(10))
# 计算同比
sales_data['上月销量'] = sales_data.groupby('产品')['销量'].transform(lambda x: x.shift(1))
sales_data['月环比'] = (sales_data['销量'] - sales_data['上月销量']) / sales_data['上月销量'] * 100
print("\n月环比分析:")
print(sales_data[sales_data['产品'] == 'A'].head(10))
案例3:分级统计与条件聚合
# 创建员工绩效数据
performance_data = pd.DataFrame({
'部门': np.random.choice(['销售部', '技术部', '市场部', '财务部'], 200),
'员工': [f'员工{i}' for i in range(1, 201)],
'绩效评分': np.random.randint(60, 100, 200),
'工龄': np.random.randint(1, 15, 200)
})
# 绩效等级分类函数
def performance_level(score):
if score >= 90:
return '优秀'
elif score >= 80:
return '良好'
elif score >= 70:
return '中等'
else:
return '需改进'
# 添加绩效等级
performance_data['绩效等级'] = performance_data['绩效评分'].apply(performance_level)
# 多级分组分析
level_analysis = performance_data.groupby(['部门', '绩效等级']).agg({
'员工': 'count',
'绩效评分': 'mean',
'工龄': 'mean'
}).rename(columns={'员工': '人数', '绩效评分': '平均评分', '工龄': '平均工龄'})
print("部门绩效等级分析:")
print(level_analysis)
# 计算各部门各等级占比
dept_totals = performance_data.groupby('部门').size()
level_pct = performance_data.groupby(['部门', '绩效等级']).size().unstack(fill_value=0)
level_pct = level_pct.div(dept_totals, axis=0) * 100
print("\n各部门绩效等级占比(%):")
print(level_pct.round(2))
实用技巧
1 分组后保留原始行
# 使用transform vs 直接分组
df['部门平均销售额'] = df.groupby('部门')['销售额'].transform('mean')
df['部门内排名'] = df.groupby('部门')['销售额'].rank(ascending=False)
print("保留原始行的分组统计:")
print(df[['部门', '员工', '销售额', '部门平均销售额', '部门内排名']])
2 复杂条件分组
# 根据条件创建分组
df['绩效级别'] = pd.cut(df['销售额'],
bins=[0, 100, 150, 200],
labels=['低', '中', '高'])
print("\n按绩效级别分组:")
for level, group in df.groupby('绩效级别'):
print(f"\n{level}级别组:")
print(group[['部门', '员工', '销售额']])
这些案例涵盖了Pandas分组扩展的主要应用场景,关键点包括:
- transform():保持原始数据行数,进行组内计算
- apply():应用自定义函数
- agg():多种聚合函数组合
- 多级分组:按多个维度分析
- 条件分组:根据业务逻辑创建分组
根据具体业务需求,可以灵活组合这些方法来实现复杂的数据分析任务。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播