以前,业务分析对应的英文单词是BusinessAnalysis,大家使用的分析工具是Excel。后来数据量大了,Excel处理不了(Excel最大支持行数为1,048,576行),人们开始转向Python、R等分析工具。这时候,对应的单词业务分析是业务分析。其实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李俊男人员输出功能同上,用多少Columns,用不用索引,标题怎么放都可以控制。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):ifx>=90:return'A'elifx>=80:return'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将两张表按编号合并即可1)#sheet1df2.merge(df1[['number','月折旧金额']],how='left',on='No.')Out[]:No.资产名称月折旧额0YT001电动门13991YT005桑塔纳轿车11472YT008打印机51案例3问题:与案例2类似,但是这个时间需要用近似查找法:输入公式=VLOOKUP(A2&"*",B2:B7区的折旧表!$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)#包含资产名称缩写的表格df3['月折旧金额']=0foriinrange(len(df3['资产名称'])):df3['月折旧金额'][i]=df1[df1['资产名称'].map(lambdax:df3['资产名称'][i]inx)]['每月折旧金额']df3Out[]:资产名称每月折旧金额0电动13991卡车24382HP1323交联101334桑塔纳11475春兰230案例4问题:输入数据信息时n在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函数一般只能搜索一项,那么如何搜索多项呢呢?如下图,如何列出张译的所有消费?方法:输入公式=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的数据透视表的操作,最终实现了如下效果:Python实现:对于这样的分组任务,首先想到的是pandas的groupby,代码也好写。思路是将刚才在Excel中点击鼠标的操作反映到代码命令中:df=pd.read_excel('test.xlsx',sheet_name='SalesStatistics')df['OrderMonth']=df['OrderDate'].apply(lambdax:x.month)df2=df.groupby(['OrderMonth','Region'])[['Sales','Cost'].agg('sum')df2['Profit']=df2['Sales']-df2['Cost']df2Out[]:销售成本利润认购月所属区域1南京134313.6194967.8439345.77常熟177531.47163220.0714311316418.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.........11Nanjing286329.88221687.1164642.77Changshu2118503.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里的pivot_table函数来实现:df3=pd.pivot_table(df,values=['sales','cost'],index=['ordermonth','area'],aggfunc='sum')df3['profit']=df3['销售额']-df3['成本']df3Out[]:成本销售额利润订购月份所属区域1南京94967.84134313.6139345.77常熟163220.07177531.4714311.40无锡231822.28316418.0984595.81昆山145403.32159183.3513780.03苏州238812.03287253.9948441.962南京138530.42187129.1348598.71Changshu126834.37154442.7427608.37Wuxi376134.98464012.2087877.22Kunshan86244.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]pandas中pivot_table的参数index/columns/values对应Excel中的参数(当然我说的等于没说,pivot表是notjustright/column/value?还有什么)但是我个人更喜欢用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',不透明度=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,name=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是best方便,如果你想画更高级或者更个性化的图形,用Python比较合适。以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能收到海量学习资料,涵盖Python电子书和教程,数据库编程、Django、爬虫、云计算等。或者去编程学习网了解更多编程技术知识。
