如何用Python Pandas处理带合并表头的Excel数据并分析绘图?
嘿,我来帮你搞定这个在Linux Mint的IPython Notebook里用Pandas处理合并表头Excel的需求!从读数据、处理表头,到设置索引、计算占比再到绘图,咱们一步一步来:
1. 先搞定环境依赖
首先确保你已经安装了需要的库,在IPython Notebook里运行:
!pip install pandas openpyxl matplotlib
pandas用来处理数据,openpyxl负责读取xlsx格式的Excel文件,matplotlib用来绘制图表。
2. 读取带合并表头的Excel并处理表头
合并表头的Excel通常是多行表头(比如第一行是大分类,第二行是子项),咱们先把数据读进来,再把合并的表头合并成清晰的单列名称:
import pandas as pd # 读取Excel,header参数指定表头所在的行(比如前两行是合并表头,就用[0,1]) df = pd.read_excel('你的文件路径.xlsx', header=[0,1]) # 把多层表头合并成单个字符串,比如"地区_年度"这种格式 df.columns = ['_'.join(col).strip() for col in df.columns.values] # 处理空行和空值:如果有全空的行就删掉,合并单元格导致的空值用前向填充(比如地区列合并的情况) df = df.dropna(how='all') df = df.fillna(method='ffill') df = df.reset_index(drop=True)
注意:如果你的合并表头是三层结构,记得把header参数改成header=[0,1,2];填充空值的方式要根据实际数据结构调整,比如有的空值不需要填充,就跳过fillna步骤
3. 设置自定义索引
根据你的需求设置索引,比如想按「地区」和「年度」做多层索引,方便后续分组计算:
# 假设你的列名是"基本信息_地区"和"基本信息_年度",根据实际合并后的列名调整 df.set_index(['基本信息_地区', '基本信息_年度'], inplace=True) # 如果只需要单索引(比如按地区),就用: # df.set_index('基本信息_地区', inplace=True)
调整列名的时候一定要对应你合并后的实际列名,别写错啦!
4. 逐年计算各地区ANC登记人数占比
假设合并后的列名是数据_ANC登记人数和数据_预计年度妊娠数,咱们计算占比(保留两位小数,转成百分比):
# 计算占比,避免分母为0的情况,这里如果预计妊娠数为0,占比设为0 df['ANC登记占比(%)'] = df.apply( lambda row: round((row['数据_ANC登记人数'] / row['数据_预计年度妊娠数']) * 100, 2) if row['数据_预计年度妊娠数'] != 0 else 0, axis=1 ) # 如果要按年度分组查看各地区的占比,可以转成宽表: annual_ratio_df = df['ANC登记占比(%)'].unstack('基本信息_地区') print(annual_ratio_df)
这样你就能看到每一年各地区的占比数据了。
5. 绘制数据图表
用matplotlib绘制年度各地区占比的柱状图,同时解决Linux Mint下的中文显示问题:
import matplotlib.pyplot as plt # 配置中文字体(Linux Mint自带Noto Sans CJK字体,直接用就行) plt.rcParams['font.sans-serif'] = ['Noto Sans CJK JP'] plt.rcParams['axes.unicode_minus'] = False # 绘制柱状图 annual_ratio_df.plot(kind='bar', figsize=(12, 6), rot=0) plt.title('各地区年度ANC登记人数占比') plt.xlabel('年度') plt.ylabel('占比(%)') plt.legend(title='地区', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
如果你的系统没有Noto字体,可以先通过终端安装:sudo apt install fonts-noto-cjk
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

