第六部分:数据透视与重塑
6.1 数据透视表
基础透视表创建
# 简单透视表(类似Excel透视表)
pivot = pd.pivot_table(df,
values=’销售额’,
index=’地区’,
columns=’产品类别’,
aggfunc=’sum’)
# 多维度透视表
complex_pivot = pd.pivot_table(df,
values=[‘销售额’, ‘利润’],
index=[‘地区’, ‘销售员’],
columns=[‘季度’, ‘月份’],
aggfunc={‘销售额’: ‘sum’, ‘利润’: ‘mean’},
fill_value=0, # 填充缺失值
margins=True, # 添加总计行/列
margins_name=’总计’) # 总计行/列的名称
高级透视功能
# 使用多个聚合函数
pivot_multi_agg = pd.pivot_table(df,
values=’销售额’,
index=’地区’,
aggfunc=[‘sum’, ‘mean’, ‘count’, ‘std’])

# 添加百分比计算
pivot_with_pct = pd.pivot_table(df,
values=’销售额’,
index=’地区’,
aggfunc=’sum’,
margins=True)
# 计算百分比
pivot_with_pct[‘占比’] = (pivot_with_pct[‘销售额’] /
pivot_with_pct.loc[‘All’, ‘销售额’] * 100).round(2)
# 多层索引处理
pivot_table = pd.pivot_table(df,
values=’销售额’,
index=[‘地区’, ‘城市’],
columns=[‘年份’, ‘季度’],
aggfunc=’sum’)
# 扁平化多层索引
pivot_table.columns = [‘_’.join(map(str, col)) for col in pivot_table.columns]
pivot_table = pivot_table.reset_index()

6.2 数据熔解与重塑
宽表转长表(melt)
# 基本melt操作
melted = pd.melt(df,
id_vars=[‘产品ID’, ‘产品名称’], # 保留的标识列
value_vars=[‘Q1’, ‘Q2’, ‘Q3’, ‘Q4’], # 要熔解的列
var_name=’季度’, # 新列名(原列名)
value_name=’销售额’) # 新列名(原值)
# 复杂熔解场景
melted_complex = pd.melt(df,
id_vars=[‘ID’, ‘名称’],
value_vars=[‘2020销售额’, ‘2021销售额’, ‘2022销售额’],
var_name=’年份’,
value_name=’销售额’)
# 提取年份数字
melted_complex[‘年份’] = melted_complex[‘年份’].str.extract(‘(d+)’).astype(int)
长表转宽表(pivot)
# pivot操作(长表转宽表)
pivoted = melted.pivot(index=[‘产品’, ‘地区’],
columns=’季度’,
values=’销售额’).reset_index()
# 处理多重索引
pivoted.columns = [‘_’.join(map(str, col)).strip() for col in pivoted.columns.values]
# 使用pivot_table处理重复值
pivot_table = pd.pivot_table(melted,
values=’销售额’,
index=[‘产品’, ‘地区’],
columns=’季度’,
aggfunc=’sum’, # 处理重复值的聚合函数

fill_value=0).reset_index()
其他重塑方法
# stack和unstack方法
stacked = df.set_index([‘地区’, ‘产品’]).stack().reset_index()
unstacked = df.set_index([‘地区’, ‘产品’]).unstack()
# wide_to_long函数(处理复杂宽表)
long_df = pd.wide_to_long(df,
stubnames=’销售额’,
i=[‘地区’, ‘产品’],
j=’季度’,
sep=’_’,
suffix=’w+’)

第七部分:数据可视化集成
7.1 基础可视化
直接绘图方法
import matplotlib.pyplot as plt
# 设置中文字体支持
plt.rcParams[‘font.sans-serif’] = [‘SimHei’, ‘Microsoft YaHei’, ‘Arial Unicode MS’]
plt.rcParams[‘axes.unicode_minus’] = False
# 创建画布
plt.figure(figsize=(12, 8))
# 折线图
plt.subplot(2, 2, 1)
df[‘销售额’].plot(kind=’line’, title=’销售额趋势’, color=’blue’, linewidth=2)
plt.ylabel(‘销售额’)
# 柱状图
plt.subplot(2, 2, 2)
df[‘产品类别’].value_counts().plot(kind=’bar’, title=’产品类别分布’, color=’green’)
plt.xticks(rotation=45)
# 饼图
plt.subplot(2, 2, 3)
df[‘地区’].value_counts().plot(kind=’pie’, autopct=’%1.1f%%’, title=’地区分布’)
plt.ylabel(”) # 隐藏y轴标签
# 散点图
plt.subplot(2, 2, 4)
df.plot(kind=’scatter’, x=’广告投入’, y=’销售额’, title=’广告投入与销售额关系’, alpha=0.6)
plt.grid(True)
plt.tight_layout()
plt.show()
分组可视化
# 分组柱状图
plt.figure(figsize=(10, 6))
df.groupby([‘地区’, ‘产品类别’])[‘销售额’].sum().unstack().plot(
kind=’bar’,
title=’各地区不同产品类别的销售额’
)
plt.xticks(rotation=45)
plt.ylabel(‘销售额’)
plt.legend(title=’产品类别’, bbox_to_anchor=(1.05, 1), loc=’upper left’)
plt.tight_layout()
plt.show()
# 堆叠柱状图
pivot_data = df.pivot_table(values=’销售额’,
index=’季度’,
columns=’产品类别’,
aggfunc=’sum’)
pivot_data.plot(kind=’bar’, stacked=True, figsize=(10, 6))
plt.title(‘各季度产品类别销售额堆叠图’)
plt.ylabel(‘销售额’)
plt.xticks(rotation=0)
plt.show()

7.2 高级可视化集成
与Excel输出结合
# 创建带图表的Excel报告
with pd.ExcelWriter(‘数据分析报告.xlsx’, engine=’xlsxwriter’) as writer:
# 写入数据
df.to_excel(writer, sheet_name=’原始数据’, index=False)
summary_df.to_excel(writer, sheet_name=’汇总统计’, index=True)
# 获取工作簿和工作表对象
workbook = writer.book
# 创建图表工作表
chart_sheet = workbook.add_worksheet(‘图表’)
# 创建柱状图
chart1 = workbook.add_chart({‘type’: ‘column’})
chart1.add_series({
‘name’: ‘销售额’,
‘categories’: ‘=汇总统计!$A$2:$A$10’,
‘values’: ‘=汇总统计!$B$2:$B$10’,
})
chart1.set_title({‘name’: ‘各地区销售额’})
chart_sheet.insert_chart(‘B2’, chart1)
# 创建饼图
chart2 = workbook.add_chart({‘type’: ‘pie’})
chart2.add_series({
‘name’: ‘销售占比’,
‘categories’: ‘=汇总统计!$A$2:$A$10’,
‘values’: ‘=汇总统计!$B$2:$B$10’,
})
chart2.set_title({‘name’: ‘销售地区占比’})
chart_sheet.insert_chart(‘B20’, chart2)
多图表报告生成
def create_analysis_report(df, output_path):
“””创建完整的数据分析报告”””
with pd.ExcelWriter(output_path, engine=’xlsxwriter’) as writer:
# 1. 原始数据表
df.to_excel(writer, sheet_name=’原始数据’, index=False)
# 2. 汇总统计表
summary_df = df.groupby(‘地区’).agg({
‘销售额’: [‘sum’, ‘mean’, ‘count’],
‘利润’: ‘sum’
}).round(2)
summary_df.to_excel(writer, sheet_name=’汇总统计’)

# 3. 趋势分析表
trend_df = df.pivot_table(values=’销售额’,
index=’月份’,
columns=’地区’,
aggfunc=’sum’,
fill_value=0)
trend_df.to_excel(writer, sheet_name=’趋势分析’)
# 获取工作簿对象
workbook = writer.book
# 设置通用格式
header_format = workbook.add_format({
‘bold’: True, ‘bg_color’: ‘#D9E1F2’, ‘border’: 1
})
number_format = workbook.add_format({‘num_format’: ‘#,##0.00’})
# 应用格式
for sheet_name in writer.sheets:
worksheet = writer.sheets[sheet_name]
worksheet.set_column(‘A:Z’, 15)
# 应用数字格式到数值列
if sheet_name != ‘原始数据’:
for col_num, col_name in enumerate(summary_df.columns):
if ‘sum’ in str(col_name) or ‘mean’ in str(col_name):
col_letter = chr(65 + col_num)
worksheet.set_column(f'{col_letter}:{col_letter}’, 15, number_format)
print(f”报告已生成: {output_path}”)
# 使用示例
create_analysis_report(df, ‘综合分析报告.xlsx’)















暂无评论内容