Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python和Excel的完美结合:常用操作汇总(案例详析)

Python和Excel的完美结合:常用操作汇总(案例详析)

作者头像
sergiojune
发布于 2022-10-08 04:55:18
发布于 2022-10-08 04:55:18
1.3K00
代码可运行
举报
文章被收录于专栏:日常学python日常学python
运行总次数:0
代码可运行

文章来源:www.jianshu.com/p/9bc9f473dd22

推荐阅读:终于来了,【第二期】 彭涛Python 爬虫特训营!!

在以前,商业分析对应的英文单词是Business Analysis,大家用的分析工具是Excel,后来数据量大了,Excel应付不过来了(Excel最大支持行数为1048576行),人们开始转向python和R这样的分析工具了,这时候商业分析对应的单词是Business Analytics。

其实python和Excel的使用准则一样,都是[We don't repeat ourselves],都是尽可能用更方便的操作替代机械操作和纯体力劳动。

用python做数据分析,离不开著名的pandas包,经过了很多版本的迭代优化,pandas现在的生态圈已经相当完整了,官网还给出了它和其他分析工具的对比:

本文用的主要也是pandas,绘图用的库是plotly,实现的Excel的常用功能有:

  • Python和Excel的交互
  • vlookup函数
  • 数据透视表
  • 绘图

以后如果发掘了更多Excel的功能,会回来继续更新和补充。开始之前,首先按照惯例加载pandas包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as npimport pandas as pdpd.set_option('max_columns', 10)pd.set_option('max_rows', 20)pd.set_option('display.float_format', lambda x: '%.2f' % x) # 禁用科学计数法

Python和Excel的交互

pandas里最常用的和Excel I/O有关的四个函数是read_csv/ read_excel/ to_csv/ to_excel,它们都有特定的参数设置,可以定制想要的读取和导出效果。

比如说想要读取这样一张表的左上部分:

可以用pd.read_excel("test.xlsx", header=1, nrows=17, usecols=3),返回结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dfOut[]:        工号   姓名 性别  部门0   A0001   张伟  男  工程1   A0002  王秀英  女  人事2   A0003   王芳  女  行政3   A0004   郑勇  男  市场4   A0005   张丽  女  研发5   A0006   王艳  女  后勤6   A0007   李勇  男  市场7   A0008   李娟  女  工程8   A0009   张静  女  人事9   A0010   王磊  男  行政10  A0011   李娜  女  市场11  A0012  刘诗雯  女  研发12  A0013   王刚  男  后勤13  A0014   叶倩  女  后勤14  A0015  金雯雯  女  市场15  A0016  王超杰  男  工程16  A0017   李军  男  人事

输出函数也同理,使用多少列,要不要index,标题怎么放,都可以控制。

vlookup函数

vlookup号称是Excel里的神器之一,用途很广泛,下面的例子来自豆瓣,VLOOKUP函数最常用的10种用法,你会几种?

案例一

问题:A3:B7单元格区域为字母等级查询表,表示60分以下为E级、60~69分为D级、70~79分为C级、80~89分为B级、90分以上为A级。D:G列为初二年级1班语文测验成绩表,如何根据语文成绩返回其字母等级?

方法:在H3:H13单元格区域中输入=VLOOKUP(G3, $A$3:$B$7, 2)

python实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_excel("test.xlsx", sheet_name=0)def grade_to_point(x):    if x >= 90:        return 'A'    elif x >= 80:        return 'B'    elif x >= 70:        return 'C'    elif x >= 60:        return 'D'    else:        return 'E'
df['等级'] = df['语文'].apply(grade_to_point)df
Out[]:      学号   姓名 性别   语文 等级0   101  王小丽  女   69  D1   102  王宝勤  男   85  B2   103  杨玉萍  女   49  E3   104  田东会  女   90  A4   105  陈雪蛟  女   73  C5   106  杨建丰  男   42  E6   107  黎梅佳  女   79  C7   108   张兴   男   91  A8   109  马进春  女   48  E9   110  魏改娟  女  100  A10  111  王冰研  女   64  D

案例二

问题:在Sheet1里面如何查找折旧明细表中对应编号下的月折旧额?(跨表查询)

方法:在Sheet1里面的C2:C4单元格输入 =VLOOKUP(A2, 折旧明细表!A$2:$G$12, 7, 0)

python实现:使用merge将两个表按照编号连接起来就行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df1 = pd.read_excel("test.xlsx", sheet_name='折旧明细表')df2 = pd.read_excel("test.xlsx", sheet_name=1) #题目里的sheet1df2.merge(df1[['编号', '月折旧额']], how='left', on='编号')Out[]:     编号   资产名称  月折旧额0  YT001    电动门   13991  YT005  桑塔纳轿车  11472  YT008    打印机    51

案例三

问题:类似于案例二,但此时需要使用近似查找

方法:在B2:B7区域中输入公式=VLOOKUP(A2&"*", 折旧明细表!$B$2:$G$12, 6, 0)

python实现:这个比起上一个要麻烦一些,需要用到一些pandas的使用技巧

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df1 = pd.read_excel("test.xlsx", sheet_name='折旧明细表') df3 = pd.read_excel("test.xlsx", sheet_name=3) #含有资产名称简写的表df3['月折旧额'] = 0for i in range(len(df3['资产名称'])):    df3['月折旧额'][i] = df1[df1['资产名称'].map(lambda x:df3['资产名称'][i] in x)]['月折旧额']
df3Out[]:   资产名称   月折旧额0   电动   13991   货车   24382   惠普    1323   交联  101334  桑塔纳   11475   春兰    230

案例四

问题:在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的想法和操作更简单方便些

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df4 = pd.read_excel("test.xlsx", sheet_name='员工基本信息表')df5 = pd.read_excel("test.xlsx", sheet_name='请假统计表')df5.merge(df4[['工号', '姓名', '部门', '职务', '入职日期']], on='工号')Out[]:       工号   姓名  部门   职务       入职日期0  A0004  龚梦娟  后勤   主管 2006-11-201  A0003   赵敏  行政   文员 2007-02-162  A0005   黄凌  研发  工程师 2009-01-143  A0007   王维  人事   经理 2006-07-244  A0016  张君宝  市场  工程师 2007-08-145  A0017   秦羽  人事  副经理 2008-03-06

案例五

问题:用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能做得更直白一些。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df6 = pd.read_excel("test.xlsx", sheet_name='消费额')df6[df6['姓名'] == '张一'][['姓名', '消费额']]Out[]:    姓名   消费额0  张一   1002  张一   3004  张一  1000

数据透视表

数据透视表是Excel的另一个神器,本质上是一系列的表格重组整合的过程。这里用的案例来自知乎,Excel数据透视表有什么用途:(https://www.zhihu.com/question/22484899/answer/39933218 )

问题:需要汇总各个区域,每个月的销售额与成本总计,并同时算出利润

通过Excel的数据透视表的操作最终实现了下面这样的效果:

python实现:对于这样的分组的任务,首先想到的就是pandas的groupby,代码写起来也简单,思路就是把刚才Excel的点鼠标的操作反映到代码命令上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df = pd.read_excel('test.xlsx', sheet_name='销售统计表')df['订购月份'] = df['订购日期'].apply(lambda x:x.month)df2 = df.groupby(['订购月份', '所属区域'])[['销售额', '成本']].agg('sum')df2['利润'] = df2['销售额'] - df2['成本']df2
Out[]:                  销售额         成本        利润订购月份 所属区域                                1    南京    134313.61   94967.84  39345.77     常熟    177531.47  163220.07  14311.40     无锡    316418.09  231822.28  84595.81     昆山    159183.35  145403.32  13780.03     苏州    287253.99  238812.03  48441.962    南京    187129.13  138530.42  48598.71     常熟    154442.74  126834.37  27608.37     无锡    464012.20  376134.98  87877.22     昆山    102324.46   86244.52  16079.94     苏州    105940.34   91419.54  14520.80             ...        ...       ...11   南京    286329.88  221687.11  64642.77     常熟   2118503.54 1840868.53 277635.01     无锡    633915.41  536866.77  97048.64     昆山    351023.24  342420.18   8603.06     苏州   1269351.39 1144809.83 124541.5612   南京    894522.06  808959.32  85562.74     常熟    324454.49  262918.81  61535.68     无锡   1040127.19  856816.72 183310.48     昆山   1096212.75  951652.87 144559.87     苏州    347939.30  302154.25  45785.05
[60 rows x 3 columns]

也可以使用pandas里的pivot_table函数来实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df3 = pd.pivot_table(df, values=['销售额', '成本'], index=['订购月份', '所属区域'] , aggfunc='sum')df3['利润'] = df3['销售额'] - df3['成本']df3 
Out[]:                   成本        销售额        利润订购月份 所属区域                                1    南京     94967.84  134313.61  39345.77     常熟    163220.07  177531.47  14311.40     无锡    231822.28  316418.09  84595.81     昆山    145403.32  159183.35  13780.03     苏州    238812.03  287253.99  48441.962    南京    138530.42  187129.13  48598.71     常熟    126834.37  154442.74  27608.37     无锡    376134.98  464012.20  87877.22     昆山     86244.52  102324.46  16079.94     苏州     91419.54  105940.34  14520.80             ...        ...       ...11   南京    221687.11  286329.88  64642.77     常熟   1840868.53 2118503.54 277635.01     无锡    536866.77  633915.41  97048.64     昆山    342420.18  351023.24   8603.06     苏州   1144809.83 1269351.39 124541.5612   南京    808959.32  894522.06  85562.74     常熟    262918.81  324454.49  61535.68     无锡    856816.72 1040127.19 183310.48     昆山    951652.87 1096212.75 144559.87     苏州    302154.25  347939.30  45785.05
[60 rows x 3 columns]

pandas的pivot_table的参数index/ columns/ values和Excel里的参数是对应上的(当然,我这话说了等于没说,数据透视表里不就是行/列/值吗还能有啥。)

但是我个人还是更喜欢用groupby,因为它运算速度非常快。我在打kaggle比赛的时候,有一张表是贷款人的行为信息,大概有2700万行,用groupby算了几个聚合函数,几秒钟就完成了。

groupby的功能很全面,内置了很多aggregate函数,能够满足大部分的基本需求,如果你需要一些其他的函数,可以搭配使用apply和lambda。

不过pandas的官方文档说了,groupby之后用apply速度非常慢,aggregate内部做过优化,所以很快,apply是没有优化的,所以建议有问题先想想别的方法,实在不行的时候再用apply。

我打比赛的时候,为了生成一个新变量,用了groupby的apply,写了这么一句:ins['weight'] = ins[['SK_ID_PREV', 'DAYS_ENTRY_PAYMENT']].groupby('SK_ID_PREV').apply(lambda x: 1-abs(x)/x.sum().abs()).iloc[:,1],1000万行的数据,足足算了十多分钟,等得我心力交瘁。

绘图

因为Excel画出来的图能够交互,能够在图上进行一些简单操作,所以这里用的python的可视化库是plotly,案例就用我这个学期发展经济学课上的作业吧,当时的图都是用Excel画的,现在用python再画一遍。开始之前,首先加载plotly包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import plotly.offline as offimport plotly.graph_objs as gooff.init_notebook_mode()

柱状图

当时用Excel画了很多的柱状图,其中的一幅图是

下面用plotly来画一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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['国家'],        y=df[2005],        name='2005',        opacity=0.6,        marker=dict(                color='aliceblue',                )        )
trace3 = go.Bar(        x=df['国家'],        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画的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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是最方便的,如果要画高级一些的或者是需要更多定制化的图形,使用python更合适。

我们爬虫第二期来了,加入我们,学更实用,更值钱的 Python 技术!

  1. 从0到1系统掌握Python 技术(入门进阶)
  2. 2个企业实战项目,4大常用工具
  3. 掌握24种反爬策略手段,成为真正爬虫高手
  4. 能抓取市面上90%的网站
  5. 掌握主流爬虫技术,就业找工作 真正全方位帮助大家从0到1,从 Python 入门到进阶,转行找爬虫工作。

扫码发送「爬虫」咨询

详情:【第二期】  彭涛Python 爬虫特训营!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 日常学python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python自动化办公——3个Excel表格中每个门店物品不同,想要汇总在一起(方法三)
前几天在Python白银交流群【上海新年人】问了一个Python自动化办公处理的问题,一起来看看吧。
Python进阶者
2023/11/02
2150
Python自动化办公——3个Excel表格中每个门店物品不同,想要汇总在一起(方法三)
Python自动化办公——3个Excel表格中每个门店物品不同,想要汇总在一起(方法二)
前几天在Python白银交流群【上海新年人】问了一个Python自动化办公处理的问题,一起来看看吧。
Python进阶者
2023/10/31
2560
Python自动化办公——3个Excel表格中每个门店物品不同,想要汇总在一起(方法二)
pandas 玩转 Excel 操作总结
pandas是一款基于NumPy的数据分析工具。它提供了大量的能使我们快捷处理数据的方法。
北山啦
2022/11/27
2.9K0
pandas 玩转 Excel 操作总结
python办公自动化-按需求批量提取EXCEL数据,python只需要几秒钟!
今天讲解的是如何利用Python来按需求批量提取EXCEL表格数据,然后进行保存。在用excel进行工作时,这样的操作在日常办公中是经常会用到,而用Python实现将会大大提高工作效率!
Python与Excel之交
2021/08/05
3.7K0
如何利用 pandas 批量合并 Excel?
今天分享一个利用Pandas进行数据分析的小技巧,也是之前有粉丝在后台进行提问的,即如何将多个pandas.dataframe保存到同一个Excel中。
刘早起
2022/09/21
9860
手把手教你用Python批量实现文件夹下所有Excel文件的第二张表合并
大家好,我是Python进阶者。今天继续给大家分享Python自动化办公的知识,之前也给大家分享过一些,感兴趣的话可以看看。
Python进阶者
2022/03/07
1.5K0
手把手教你用Python批量实现文件夹下所有Excel文件的第二张表合并
多张excel表做连接,就比如1表有A,B,C列,2表有A,B,D列,我想把A,B,C,D合到一张表
前几天在Python铂金群有个叫【水方人子】的粉丝问了一个关于excel处理的问题,这里拿出来给大家分享下,一起学习。
前端皮皮
2022/08/17
4160
多张excel表做连接,就比如1表有A,B,C列,2表有A,B,D列,我想把A,B,C,D合到一张表
100天精通Python丨办公效率篇 —— 07、Python自动化操作 Excel(读写、增删改查、分组统计)
小伙伴你好,在开始操作 Excel 之前,你需要安装 Python 和一些相关库。可以使用 pip 安装以下库,或者使用专业的 python 客户端:pycharm,快速安装 python 和相关库。
不吃西红柿
2023/04/12
1.8K0
【愚公系列】2023年07月 Python自动化办公之pandas操作excel
Pandas是一个用于数据操作和数据分析的Python库。它提供了高效的数据结构,使得处理数据变得更加简单和快捷。Pandas的核心数据结构包括两种类型:Series和DataFrame。Series是一维的数据结构,类似于数组,可以容纳任何类型的数据。DataFrame是二维的数据结构,可以认为是一个表格,其中每列可以是不同类型的数据。Pandas还提供了许多数据操作和数据分析的方法,例如数据清洗、数据筛选、数据变换、数据分组等等。Pandas的优点包括:易于操作、高效处理大数据、内置可视化工具、灵活的数据结构、支持多种数据格式等等。
愚公搬代码
2025/05/28
1760
【愚公系列】2023年07月 Python自动化办公之pandas操作excel
pandas速成笔记(2)-excel增删改查基本操作
第3行输出的就是表格数据,注意最左没有列名的这列,从0到5,如果做过数据库开发的同学,应该都知道:数据表内部通常会有一个唯一键,也称为主键索引。pandas读取的excel,如果没有指定索引,默认会按数字顺序,生成1个默认的索引,即上面的0-5。
菩提树下的杨过
2022/04/27
1.7K0
pandas速成笔记(2)-excel增删改查基本操作
python读写excel的一些技巧
python处理excel的库很多,例如xlrd/xlwt/openpyxl/xlsxwriter等。每个库都有一定的局限性,pandas处理excel是基于这些库的,所以集大成者。 个人还是比较喜欢用pandas, 开箱即用。
赵云龙龙
2021/01/28
1.8K0
Python可视化数据分析08、Pandas_Excel文件读写
Python可视化数据分析08、Pandas_Excel文件读写 📋前言📋 💝博客:【红目香薰的博客_CSDN博客-计算机理论,2022年蓝桥杯,MySQL领域博主】💝 ✍本文由在下【红目香薰】原创,首发于CSDN✍ 🤗2022年最大愿望:【服务百万技术人次】🤗 💝Python初始环境地址:【Python可视化数据分析01、python环境搭建】💝  ---- 环境需求 环境:win10 开发工具:PyCharm Community Edition 2021.2 数据库:MySQ
红目香薰
2022/11/30
7120
Python可视化数据分析08、Pandas_Excel文件读写
pandas速成笔记(3)-join/groupby/sort/行列转换
有数据库开发经验的同学,一定对sql中的join ... on 联表查询不陌生,pandas也有类似操作
菩提树下的杨过
2022/04/27
7940
pandas速成笔记(3)-join/groupby/sort/行列转换
python使用pandas的常用操作
Pandas 的名字来源于“Panel Data”和“Python Data Analysis Library”的缩写。它最初由 Wes McKinney 开发,旨在提供高效、灵活的数据操作和分析工具。Pandas 在数据科学、统计分析、金融、经济学等领域得到了广泛应用。
梦无矶小仔
2024/06/06
7840
python使用pandas的常用操作
Python自动化之Excel数据表合并
之前已经分享了Excel自动化的两篇文章。今天为大家带来第三篇。如有需要,请看下方链接(源码在下方视频中)
用户2966292
2023/03/18
3840
Python自动化之Excel数据表合并
Python 处理Excel总结
一个测试有两个sheet页的Excel测试文件 https://github.com/dongkelun/python/blob/master/data/test.xlsx
小明互联网技术分享社区
2022/10/31
3900
Python 处理Excel总结
Python基础-Pandas
提供了高效地操作大型数据集所需的工具,支持数据上做各种变化。 为Python提供高性能、易使用的数据结构和数据分析工具。 用于数据挖掘和数据分析,同时也提供数据清洗功能。 使用时先导入 import pandas as pd (往后的调用只需要输入pd即可,当然也可以把as pd 改成任何使用者喜欢的词汇,比如 as AB 之类的) 里面有两大数据结构在很多情况下都会用到: Series 和 DataFrame。
凑齐六个字吧
2024/07/25
2920
Python基础-Pandas
解决Pandas的to_excel()写入不同Sheet,而不会被重写
在使用Pandas的to_excel()方法写入数据时,当我们想将多个数据写入一个Excel表的不同DataFrame中,虽然能够指定sheet_name参数,但是会重写整个Excel之后才会存储。
py3study
2020/12/22
3.4K0
解决Pandas的to_excel()写入不同Sheet,而不会被重写
在Python中实现Excel的VLOOKUP、HLOOKUP、XLOOKUP函数功能
Excel的LOOKUP公式可能是最常用的公式之一,因此这里将在Python中实现Excel中查找系列公式的功能。事实上,我们可以使用相同的技术在Python中实现VLOOKUP、HLOOKUP、XLOOKUP或INDEX/MATCH等函数的功能。
fanjy
2022/11/16
8.3K0
在Python中实现Excel的VLOOKUP、HLOOKUP、XLOOKUP函数功能
数据处理小技巧:根据指定内容提取行
两个excel表格有共同的一列A,第一个表格数据少,第二个表格数据多,我现在想根据表1的A列将表2中包含A列的内容提取出来; 简单说就是提取表格中指定的行
用户7010445
2020/03/03
1.3K0
推荐阅读
相关推荐
Python自动化办公——3个Excel表格中每个门店物品不同,想要汇总在一起(方法三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验