从Excel到图表:详解pandas数据读取与matplotlib折线图实战技巧

📅 2026/7/15 2:30:27
从Excel到图表:详解pandas数据读取与matplotlib折线图实战技巧
1. 从Excel到DataFramepandas数据读取全攻略刚接触数据分析时我最头疼的就是怎么把Excel里的数据变成能操作的格式。直到发现了pandas的read_excel()函数简直像找到了瑞士军刀。这个函数有二十多个参数但实际工作中掌握这几个核心参数就够了文件路径的坑我踩过第一次用相对路径时脚本死活找不到文件。后来发现VSCode的当前工作目录可能和脚本所在目录不同。建议先用os.getcwd()确认路径或者直接用绝对路径import os print(os.getcwd()) # 查看当前工作目录 df pd.read_excel(rC:\data\sales.xlsx) # 绝对路径最稳多sheet处理技巧当Excel有多个工作表时可以一次性全部读取为字典all_sheets pd.read_excel(data.xlsx, sheet_nameNone) # 返回{sheet名: DataFrame} q1_data all_sheets[第一季度] # 按sheet名提取列处理的实战经验遇到没有表头的数据时headerNone配合names参数自定义列名用usecolsA,C,E或usecols[0,2,4]只读取特定列大数据文件特别有用dtype{手机号: str}强制类型转换避免长数字变成科学计数法遇到过最诡异的问题是日期列读取异常后来发现用parse_datesTrue自动解析日期或者指定date_parser自定义解析函数def custom_parser(x): return pd.to_datetime(x, format%Y年%m月%d日) df pd.read_excel(data.xlsx, parse_dates[日期], date_parsercustom_parser)2. 数据清洗DataFrame的整形手术从Excel读出来的数据经常像没整理的衣柜——杂乱无章。分享几个我常用的清洗套路处理缺失值先用df.isnull().sum()统计每列缺失值数量。小规模缺失可以用df.fillna({列A:0, 列B:未知})按列填充连续型数据建议用df.interpolate()插值。重复值去重df.drop_duplicates(subset[姓名,手机号], keeplast)保留最后一条记录。异常值处理我常用3σ原则找出离群点mean, std df[销售额].mean(), df[销售额].std() df df[(df[销售额] mean-3*std) (df[销售额] mean3*std)]列拆分合并地址列拆分成省市区三列df[[省,市,区]] df[地址].str.extract(r(.*?)省(.*?)市(.*?)区)3. 折线图基础matplotlib快速入门第一次画折线图时我被各种参数搞晕了。其实核心就是三步准备数据x轴和y轴的数据序列创建画布plt.figure(figsize(10,5))控制图片大小绘制图形plt.plot(x, y, label销量)新手常见问题中文显示乱码全局设置字体plt.rcParams[font.sans-serif] [SimHei] # 黑体 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题图片模糊保存时指定dpiplt.savefig(chart.png, dpi300, bbox_inchestight) # 高分辨率保存4. 专业级折线图让你的图表会说话经过上百次图表调整我总结出这些美化技巧多曲线对比用不同线型标记点区分plt.plot(x, y1, ro-, label北京) # 红色圆点实线 plt.plot(x, y2, b*--, label上海) # 蓝色星号虚线添加辅助元素plt.title(各月销售趋势, fontsize14, pad20) # 标题与图的间距 plt.xlabel(月份, labelpad10) # x轴标签与刻度距离 plt.ylabel(销售额(万元)) plt.grid(axisy, linestyle:, alpha0.5) # 只显示横向网格线自定义刻度当自动生成的刻度不合适时plt.xticks(range(1,13), [1月,2月,...,12月], rotation45) plt.yticks(np.arange(0, 50000, 5000)) # 0到5万步长5千添加标注突出显示特殊点max_point df[销售额].idxmax() plt.annotate(f峰值:{df.loc[max_point,销售额]}, xy(max_point, df.loc[max_point,销售额]), xytext(max_point1, df.loc[max_point,销售额]-2000), arrowpropsdict(arrowstyle-))5. pandas与matplotlib的完美配合其实pandas内置了基于matplotlib的绘图方法DataFrame可以直接画图快速绘图df.plot(x月份, y[北京,上海], style[-o,--s], title各城市销售对比)双Y轴技巧当数据量级差异大时ax df[销售额].plot(kindline, colorr) ax2 ax.twinx() # 创建第二个Y轴 df[增长率].plot(axax2, kindbar, colorb, alpha0.3)保存到Excel用openpyxl或xlsxwriter引擎writer pd.ExcelWriter(report.xlsx, enginexlsxwriter) df.to_excel(writer, sheet_name数据) workbook writer.book worksheet writer.sheets[数据] # 插入图表 chart workbook.add_chart({type: line}) chart.add_series({values: 数据!$B$2:$B$13}) worksheet.insert_chart(D2, chart) writer.close()6. 实战销售数据分析全流程假设我们有2023年各门店销售数据现在要分析数据准备df pd.read_excel(sales_2023.xlsx, parse_dates[订单日期], dtype{门店编码:str})按月汇总monthly df.resample(M, on订单日期).agg({ 销售额:sum, 订单数:count, 利润:mean })绘制组合图fig, ax1 plt.subplots(figsize(12,6)) ax1.plot(monthly.index, monthly[销售额], b-o, label销售额) ax1.set_ylabel(销售额(万元)) ax2 ax1.twinx() ax2.bar(monthly.index, monthly[订单数], alpha0.3, colorg, label订单数) ax2.set_ylabel(订单数) plt.title(2023年月度销售趋势) lines1, labels1 ax1.get_legend_handles_labels() lines2, labels2 ax2.get_legend_handles_labels() plt.legend(lines1lines2, labels1labels2, locupper left)7. 常见问题解决方案问题1画出来的图x轴标签挤在一起解决旋转标签调整画布plt.xticks(rotation45) plt.subplots_adjust(bottom0.2) # 调整底部边距问题2数据量太大导致折线图变成毛球解决用滚动均值平滑曲线df[销售额_7天平均] df[销售额].rolling(7).mean() df.plot(y销售额_7天平均)问题3导出图片边缘被裁剪解决保存时调整参数plt.savefig(output.png, bbox_inchestight, pad_inches0.1)8. 效率提升技巧样式模板创建自己的matplotlib样式plt.style.use(seaborn) # 使用内置样式 # 或自定义 plt.rcParams.update({ figure.titlesize: 16, axes.labelsize: 12, xtick.labelsize: 10 })批量出图自动生成多张图表for city in df[城市].unique(): temp df[df[城市]city] temp.plot(x月份, y销售额, titlef{city}销售趋势) plt.savefig(f{city}.png) plt.close() # 防止内存泄漏交互式图表用mpld3库转为网页交互图表import mpld3 fig plt.figure() plt.plot(df[月份], df[销售额]) mpld3.save_html(fig, chart.html)