当前位置: 首页 > 后端技术 > Python

Python与Excel的完美结合:常用操作总结(案例分析)

时间:2023-03-26 12:02:37 Python

以前,业务分析的英文单词是BusinessAnalysis,大家使用的分析工具是Excel。后来数据量大了,excel处理不了了(excel支持的最大行数是1048576行)。人们开始转向python、R等分析工具,此时与业务分析对应的词就是BusinessAnalytics。其实python和Excel的使用指南是一样的,都是【不再赘述】,都尽可能用更方便的操作来代替机械操作和纯手工劳动。使用python进行数据分析离不开大名鼎鼎的pandas包。经过多个版本的迭代优化,目前pandas的生态系统已经相当完善。官网也给出了它和其他分析工具的对比:本文主要使用Pandas,绘图用的库是plotly,实现了Excel的常用功能:Python和Excel的交互vlookup函数,数据透视表绘图.如果大家发现了Excel更多的功能,会回来继续更新补充的。在开始之前,首先像往常一样加载pandas包:importnumpyasnpiimportpandasaspdpd.set_option('max_columns',10)pd.set_option('max_rows',20)pd.set_option('display.float_format',lambdax:'%.2f'%x)#禁用科学记数法Python和Excel交互pandas中与ExcelI/O相关的四个最常用的函数是read_csv/read_excel/to_csv/to_excel,它们都有特定的参数设置,你可以自定义所需的读取和导出效果。比如你要读取这样一个表的左上部分:可以使用pd.read_excel("test.xlsx",header=1,nrows=17,usecols=3),返回结果:dfOut[]:工号、姓名、性别部门0A0001张维南工程1A0002王秀英女务2A0003王芳女行政3A0004郑永南市场4A0005张琳女研发5A0006王艳女物流6A0007李永南市场7A0008李娟女工程8A0009张静女事务9A0010王蕾男政10A0011李娜女市场11A0012刘诗雯女研发12A0013王刚男后勤13A0014叶倩女后勤14A0015金雯雯女市场15A0016王超杰男工16A0017李俊男人员输出功能同上,使用多少栏目,可以控制要不要索引,标题怎么放。vlookup函数vlookup被誉为Excel中的神器之一。它具有广泛的用途。以下例子来自豆瓣。VLOOKUP函数最常用的10个函数。你知道多少?案例1问题:A3:B7单元格范围为字母等级查询表格显示60分以下为E级,60~69为D级,70~79为C级,80~89为B级,90分以上为A级D:G列为二年级一班的语文成绩表,如何根据语文成绩返回字母等级?方法:在H3:H13单元格区域输入=VLOOKUP(G3,$A$3:$B$7,2)。Python实现:df=pd.read_excel("test.xlsx",sheet_name=0)defgrade_to_point(x):如果x>=90:返回'A'elifx>=80:返回'B'elifx>=70:return'C'elifx>=60:return'D'else:return'E'df['Grade']=df['Chinese'].apply(grade_to_point)dfOut[]:学号,姓名,性别,语文等级0101王小丽女69D1102王宝琴男85B2103杨玉萍女49E3104田东辉女90A4105陈雪娇女73C5106杨建峰男42E6107李美佳女79C7108张兴楠91A8109马金春女48E9110魏改娟女100A10111王冰艳女64D案例2问题:如何在Sheet1月折旧额中找到折旧表中对应的数字?(跨表查询)方法:在Sheet1的C2:C4单元格中输入=VLOOKUP(A2,折旧表!A$2:$G$12,7,0)。Python实现:使用merge将两张表按编号连接起来OKdf1=pd.read_excel("test.xlsx",sheet_name='depreciationschedule')df2=pd.read_excel("test.xlsx",sheet_name=1)#sheet1df2.merge(df1[['标题中的数字','月折旧金额']],how='left',on='数字')Out[]:编号资产名称月折旧额0YT001电动门13991YT005桑塔纳轿车11472YT008打印机51案例3问题:与案例2类似,但此时需要使用近似查找法:输入公式=VLOOKUP(A2&"*intheB2:B7area",Depreciationschedule!$B$2:$G$12,6,0)Python实现:这个比上一个麻烦,需要一些pandas技巧df1=pd.read_excel("test.xlsx",sheet_name='depreciationschedule')df3=pd.read_excel("test.xlsx",sheet_name=3)#sheetcontainingassetnameabbreviationsdf3['monthlydepreciationamount']=0foriinrange(len(df3['资产name'])):df3['每月折旧金额'][i]=df1[df1['资产名称'].map(lambdax:df3['资产名称'][i]inx)]['每月折旧金额']df3Out[]:资产名称每月折旧金额0纯电动13991货车24382HP1323Crosslink101334桑塔纳11475春兰230案例4问题:在Excel中录入数据信息时,为了提高工作效率,用户希望输入数据输入关键字后,会自动显示记录的剩余信息。比如输入员工的工号会自动显示员工的功劳,输入物料编号会自动显示物料的品名、单价等,如图。基本信息的数据源表,在工作表“2010年3月员工请假统计”中,A列输入员工工号时,如何实现对应的员工姓名、工号、部门、职位、录入日期等.自动录入信息?方法:使用VLOOKUP+MATCH函数,选中“2010年3月员工请假统计”工作表B3:F8单元格区域,输入如下公式=IF($A3="","",VLOOKUP($A3,员工基本信息!$A:$H,MATCH(B$2,员工基本信息!$2:$2,0),0)),按【Ctrl+Enter】结束。Python实现:上面的Excel方法很灵活,但是pandas的思路和操作更简单方便"test.xlsx",sheet_name='离开统计表')df5.merge(df4[['就业人数','name','部门','职位','入职日期']],on='工号')Out[]:工号,姓名,部门,职位,入职日期0A0004龚梦娟,后勤主管,2006-11-201A0003赵敏行政文员2007-02-162A0005黄玲研发工程师2009-01-143A0007王伟人事经理2006-07-244A0016张俊宝营销工程师2007-08-145A0017秦宇人力资源部副经理2008-03-06案例5问题:使用VLOOKUP函数实现批量搜索。VLOOKUP函数一般只能搜索一项,那么如何搜索多项呢呢?如下图,如何列出张译的所有消费?方法:在C9:C11单元格中输入公式=VLOOKUP(B$9&ROW(A1),IF({1,0},$B$2:$B$6&COUNTIF(INDIRECT("b2:b"&ROW($2:$6))),B$9),$C$2:$C$6),2,),按SHIFT+CTRL+ENTER结束。Python实现:vlookup函数有两个缺点(或者说特点),一个是要查找的值必须在区域的第一列,另一个是只能查找一个值,其他的不会查找搜索到就算能匹配到也是可以的,这两点可以通过灵活应用if和indirect函数来解决,但是pandas做起来更直接。df6=pd.read_excel("test.xlsx",sheet_name='消费金额')df6[df6['姓名']=='张毅'][['姓名','消费金额']]Out[]:名称消费金额0表1002表13004表1000数据透视表数据透视表是Excel的又一神器,本质上是对一系列表格进行重组整合的过程。这里用到的案例来自知乎,Excel数据透视表有什么用:(https://www.zhihu.com/questio...)月,并同时通过Excel的数据透视表运算计算利润,最终实现如下效果:Python实现:对于这样的分组任务,首先想到的是pandas的groupby,而且代码很容易写。鼠标操作体现在代码命令上:df=pd.read_excel('test.xlsx',sheet_name='销售统计表')df['ordermonth']=df['orderdate'].apply(lambdax:x.month)df2=df.groupby(['ordermonth','area'])[['sales','cost']].agg('sum')df2['profit']=df2['销售额']-df2['成本']df2Out[]:销售额成本利润订购月份所属区域1南京134313.6194967.8439345.77常熟177531.47163220.0714311.40无锡316418.09231822.2884595.81昆山159183.35145403.3213780.03苏州287253.99238812.0348441.962南京187129.13138530.4248598.71常熟154442.74126834.3727608.37无锡464012.20376134.9887877.22昆山102324.4686244.5216079.94苏州105940.3491419.5414520.80...886...12292南京7.1164642.77常熟2118503.541840868.53277635.01无锡633915.41536866.7797048.64昆山351023.24342420.188603.06苏州1269351.391144809.83124541.5612南京894522.06808959.3285562.74常熟324454.49262918.8161535.68无锡1040127.19856816.72183310.48昆山1096212.75951652.87144559.87苏州347939.30302154.2545785.05[60rowsx3columns]也可以使用pandas里Thepivot_tablefunctiontoachieve:df3=pd.pivot_table(df,values=['sales','cost'],index=['ordermonth','area'],aggfunc='sum')df3['利润']=df3['销售额']-df3['成本']df3Out[]:成本销售额利润订购月份所属区域1南京94967.84134313.6139345.77常熟163220.07177531.4714311.40无锡231822.28316418.0984595.81昆山145403.32159183.3513780.03苏州238812.03287253.9948441.962Nanjing138530.42187129.1348598.71Changshu126834.37154442.7427608.37Wuxi376134.98464012.2087877.22昆山86244.52102324.4616079.94苏州91419.54105940.3414520.80.........11南京221687.11286329.8864642.77常熟1840868.532118503.54277635.01无锡536866.77633915.4197048.64昆山342420.18351023.248603.06苏州1144809.831269351.39124541.5612南京808959.32894522.0685562.74常熟262918.81324454.4961535.68无锡856816.721040127.19183310.48昆山951652.871096212.75144559.87苏州302154.25347939.3045785.05[60rowsx3columns]pandasindex/columns/values中pivot_table的参数和Excel中的是一样的不是吗/valuerow/colum)个人比较喜欢用groupby,因为速度很快。我在打Kaggle比赛的时候,有个表格是放款人行为信息,大概2700万行。我用groupby计算了几个聚合函数,几秒就搞定了。groupby的功能非常全面,内置了很多聚合函数,可以满足大部分的基本需求。如果你需要一些其他的功能,你可以使用apply和lambda一起使用。但是pandas官方文档说在groupby之后使用apply很慢,而aggregate内部做了优化,所以很快,apply没有优化,有问题建议考虑其他方法,然后在出现问题时使用apply。我在玩游戏的时候,为了生成一个新的变量,使用了groupby的apply,写了这样一句话:ins['weight']=ins[['SK_ID_PREV','DAYS_ENTRY_PAYMENT']].groupby('SK_ID_PREV').apply(lambdax:1-abs(x)/x.sum().abs()).iloc[:,1],1000万行数据,计算了十多分钟,等得累死了.绘图由于Excel绘制的图形可以交互,可以对图形进行一些简单的操作,所以这里使用的python可视化库是plotly。以我这学期发展经济学课上的作业为例。当时的图都是我用Excel画的,现在又用python画了。在开始之前,首先加载plotly包。importplotly.offlineasoffimportplotly.graph_objsasgooff.init_notebook_mode()Histogram当时用Excel画了很多直方图,其中一个就是用plotly画df=pd.read_excel("plot.xlsx",sheet_name='高等教育入学率')trace1=go.Bar(x=df['国家'],y=df[1995],name='1995',opacity=0.6,marker=dict(color='powderblue'))trace2=go.Bar(x=df['country'],y=df[2005],name='2005',opacity=0.6,marker=dict(color='aliceblue',))trace3=go.Bar(x=df['country'],y=df[2014],name='2014',opacity=0.6,marker=dict(color='royalblue'))layout=go.Layout(barmode='group')data=[trace1,trace2,trace3]fig=go.Figure(data,layout)off.plot(fig)用Excel画的雷达图:用python画的:df=pd.read_excel('plot.xlsx',sheet_name='政治治理')theta=df.columns.tolist()theta.append(theta[0])names=df.indexdf['']=df.iloc[:,0]df=np.array(df)trace1=go.Scatterpolar(r=df[0],theta=theta,name=names[0])trace2=go.Scatterpolar(r=df[1],theta=theta,name=names[1])trace3=go.Scatterpolar(r=df[2],theta=theta,name=names[2])trace4=go.Scatterpolar(r=df[3],theta=theta,名字=names[3])data=[trace1,trace2,trace3,trace4]layout=go.Layout(polar=dict(radialaxis=dict(visible=True,range=[0,1])),showlegend=True)fig=go.Figure(data,layout)off.plot(fig)画起来比Excel麻烦多了。一般来说,如果画的是简单、基础的图形,用Excel是最方便的。如果你想画的更高级或者需要更个性化的图形,用python比较合适。作者:廖志军链接:https://www.jianshu.com/p/9bc...文渊网,仅供学习,如有侵权请联系删除。学习Python的路上肯定会遇到困难,不要慌张,我这里有一套学习资料,包括40+电子书,800+教学视频,涉及Python基础、爬虫、框架、数据分析、机学习等等,别怕你学不会!https://shimo.im/docs/JWCghr8...《Python学习资料》关注公众号【蟒圈】,每日优质文章推送。