本文目录导读:

我来介绍几种使用Pandas进行数据交叉统计的常用方法:
使用crosstab()函数(最常用)
基本用法
import pandas as pd
# 创建示例数据
df = pd.DataFrame({
'性别': ['男', '女', '男', '女', '男', '女'],
'学历': ['本科', '硕士', '本科', '博士', '硕士', '本科'],
'城市': ['北京', '上海', '广州', '北京', '上海', '广州'],
'年龄': [25, 28, 32, 30, 27, 29]
})
# 简单交叉表 - 统计性别与学历的交叉频数
cross_tab = pd.crosstab(df['性别'], df['学历'])
print("性别与学历交叉统计:")
print(cross_tab)
进阶用法
# 带边距(总计)
cross_tab_margin = pd.crosstab(df['性别'], df['学历'], margins=True, margins_name='合计')
print("\n带总计的交叉表:")
print(cross_tab_margin)
# 显示百分比
cross_tab_pct = pd.crosstab(df['性别'], df['学历'], normalize='index') # 按行百分比
print("\n按性别百分比:")
print(cross_tab_pct)
# 多维度交叉
cross_tab_multi = pd.crosstab([df['性别'], df['城市']], df['学历'])
print("\n多维度交叉统计:")
print(cross_tab_multi)
# 添加聚合值
cross_tab_agg = pd.crosstab(df['性别'], df['学历'],
values=df['年龄'], aggfunc='mean')
print("\n平均年龄交叉表:")
print(cross_tab_agg)
使用pivot_table()函数
# 创建透视表
pivot = df.pivot_table(
values='年龄', # 要聚合的值
index='性别', # 行索引
columns='学历', # 列索引
aggfunc='mean', # 聚合函数
margins=True # 显示总计
)
print("\n透视表统计:")
print(pivot)
# 多种聚合函数
pivot_multi = df.pivot_table(
values='年龄',
index='性别',
columns='学历',
aggfunc=['count', 'mean', 'std']
)
print("\n多种统计指标:")
print(pivot_multi)
实际业务案例
电商用户分析
# 模拟电商数据
sales_data = pd.DataFrame({
'用户ID': range(1, 101),
'性别': ['男', '女'] * 50,
'年龄段': ['18-25', '26-35', '36-45', '46-55'] * 25,
'消费等级': ['高', '中', '低'] * 33 + ['高'],
'购买次数': np.random.randint(1, 20, 100),
'消费金额': np.random.randint(100, 5000, 100)
})
# 分析不同性别的消费等级分布
gender_spend = pd.crosstab(sales_data['性别'], sales_data['消费等级'])
print("性别与消费等级交叉统计:")
print(gender_spend)
# 分析年龄段和消费等级的平均购买次数
age_spend = pd.crosstab(sales_data['年龄段'], sales_data['消费等级'],
values=sales_data['购买次数'], aggfunc='mean')
print("\n各年龄段各消费等级的平均购买次数:")
print(age_spend.round(1))
学生成绩分析
# 模拟学生数据
student_data = pd.DataFrame({
'班级': ['A班', 'B班', 'A班', 'B班', 'A班', 'B班'] * 10,
'科目': ['数学', '数学', '语文', '语文', '英语', '英语'] * 10,
'成绩': np.random.randint(60, 100, 60),
'性别': ['男', '女'] * 30
})
# 分析各班级各科目平均成绩
class_subject = pd.crosstab(student_data['班级'], student_data['科目'],
values=student_data['成绩'], aggfunc='mean')
print("各班级各科目平均成绩:")
print(class_subject.round(1))
# 多维度分析:班级+性别 vs 各科目成绩
multi_dim = student_data.pivot_table(
values='成绩',
index=['班级', '性别'],
columns='科目',
aggfunc=['mean', 'count']
)
print("\n班级+性别与各科目成绩:")
print(multi_dim.round(1))
数据可视化结合
import matplotlib.pyplot as plt
import seaborn as sns
# 创建交叉统计并可视化
cross_vis = pd.crosstab(df['城市'], df['性别'])
print("城市与性别交叉统计:")
print(cross_vis)
# 热力图展示
plt.figure(figsize=(10, 6))
sns.heatmap(cross_vis, annot=True, cmap='YlOrRd', fmt='d')'城市与性别交叉统计热力图')
plt.show()
实用技巧
# 1. 多级列索引的处理
multi_col = pd.crosstab(df['性别'], [df['学历'], df['城市']])
print("多级列索引:")
print(multi_col)
# 2. 自定义排序
cross_sorted = pd.crosstab(df['性别'], df['学历'])
cross_sorted = cross_sorted.reindex(['男', '女'], axis=0) # 自定义行顺序
# 3. 添加条件过滤
high_age = df[df['年龄'] > 28]
cross_filter = pd.crosstab(high_age['性别'], high_age['学历'])
print("年龄>28的性别与学历交叉:")
print(cross_filter)
# 4. 数据汇总
cross_summary = pd.crosstab(df['性别'], df['学历'],
values=df['年龄'],
aggfunc={'年龄': ['count', 'mean', 'sum']})
这些方法可以帮助你快速完成数据的交叉统计分析,根据具体需求选择合适的方法!