Python自动化办公应用学习笔记64—Pandas库操作Excel文件5

第六部分:数据透视与重塑

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’])

Python自动化办公应用学习笔记64—Pandas库操作Excel文件5

# 添加百分比计算

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()

Python自动化办公应用学习笔记64—Pandas库操作Excel文件5

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’, # 处理重复值的聚合函数

Python自动化办公应用学习笔记64—Pandas库操作Excel文件5

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+’)

Python自动化办公应用学习笔记64—Pandas库操作Excel文件5

第七部分:数据可视化集成

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()

Python自动化办公应用学习笔记64—Pandas库操作Excel文件5

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=’汇总统计’)

Python自动化办公应用学习笔记64—Pandas库操作Excel文件5

# 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’)

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 共1条

请登录后发表评论