现在坐办公室的各种大小团体里,都会有一个“懂Excel的人”,可能那个人是团体里的一员,也可能是和这个团队关系比较好的一个热心人,但总之,你的身边会有这么一个人。如果你环顾四周也没发现,那可能你就是那个懂Excel的人。

从基本的打印添加表头,到筛选排序,再到vlookup各种花式,Excel确实是促进生产力的一大利器,不过这个工具为了保证易用性也做了很多的妥协,包括但不限于:

  1. 没有强制用户使用数据表格式。

很多人应该都听过这样一个新闻:数据汪:日本老爷爷坚持17年用Excel作画,我可能用了假的Excel 当然老人家的确是很厉害,但是从另外一个角度来说,一个用来处理数据的软件,在软件的输入端竟然可以画画,难道不也说明了这个软件是多么的随和以及不专业。毕竟数据处理不是画画,最基本的原则还是要遵守的。

2. 将数据呈现和数据处理混在一起

数据的录入,分析与计算对数据表的格式是有需求的,所以看起来会不大美观。如果要美观,你需要的是数据分析报告。不过Excel里面不管是报告、原始数据还是图标都是一箩筐放在数据表里面。

然后就是让人深恶痛绝的合并单元格

3. 黑箱一时爽,回头火葬场

Excel会自动对数据进行格式转化。一个比较经典的例子就是“MARC1”基因这个例子。在Excel里面这个字符会自动被转换成3月1日。有人写了个小程序“解决”了这个问题,然后在Plos one上面发了个文章。

然后复制粘贴过程中的自动偏移,vlookup在大表格里对性能的考验……

但是,Excel绝对是非常强大的一个软件,之所以有时候会犯傻,那也只是大智若愚,毕竟为了照顾用户总是要做一些牺牲的。


“这个问题用Excel怎么解决呢?”用Pandas吧

比如吧,交叉表怎么转换回数据表呢?Excel有数据透视表的功能,可以将数据表转换成交叉表,但是没有反向转换的功能。VBA是一个选项,但是,拜托,既然你已经开始讲编程提上日程了,那难道不应该选择更加流行一点的语言么?

TIOBE index,2019年8月

你们心心念念的VB排在16位,VB .NET排在第六位,是不错啦,比起Swift,Perl,R这些来说的话。但是Python好歹也是排在第3呀,真的不考虑一下么?

pandas是一个数据处理的库,基于python语言。下面举几个例子展示一下pandas的能力:

读取和写入Excel文件

读取和写入csv就相当简单了,但是excel的话还是需要首先安装几个包:(xlrd,xlsxwriter)

读取:

import pandas as pd
xl_file = pd.ExcelFile('filepath.xlsx') #接受excel文件路径,建立Excel文件对象
df = xl_file.parse('Sheet_name') #parse接受工作表名称,将工作表转换成Dataframe

df现在就是一个dataframe了,你可以用df.columns看看表头有哪些列,你可以用df.loc['行标签','列标签']获取/设置特定位置的内容,用apply,或者是向量化运算处理数据

写入:

xl_writer = pd.ExcelWriter('out.xlsx',engine='xlsxwriter')
df.to_excel(xl_writer,'Sheet0')
xl_writer.save()

pandas.DataFrame.to_excel - pandas 0.25.1 documentation​pandas.pydata.org

所以说,pandas读取和写入Excel文件都是非常容易的。

交叉表变数据表

用下面的一组数据为例

df = pd.DataFrame([['jane',20,83,41],['tom',22,89,82],['mike',24,55,93]],columns=['name','age','grade_curr1','grade_curr2'])
df
Out[10]: name  age  grade_curr1  grade_curr2
0  jane   20           83           41
1   tom   22           89           82
2  mike   24           55           93

可以看到这里有三行数据,包括了姓名,年龄,以及两个科目的成绩。第三列和第四列其实都是成绩,所以如果能放在一列会更方便后续的分析。

df_melted = df.melt(id_vars=['name','age'],value_vars=['grade_curr1','grade_curr2'])
df_melted
Out[13]: name  age     variable  value
0  jane   20  grade_curr1     83
1   tom   22  grade_curr1     89
2  mike   24  grade_curr1     55
3  jane   20  grade_curr2     41
4   tom   22  grade_curr2     82
5  mike   24  grade_curr2     93

分组统计

可能看了上面的例子你没有觉得哪里更“方便”了。那让我们加一些细节。比如现在还是这三个人,分别接受两个项目的考试(curr1和curr2),每个考试可以最多参加3次,但是也有人只参加了1次。所以成绩登记出来是下面这样的:

如果现在要求空白数据不纳入分析(比如jane的科目1只参加了两次考试,所以平均分应该是74+80/2=77)。那……用Excel你准备怎么做呢?要滤掉空白项那你必须用筛选呀,用筛选就……肯定要形成数据表呀……

import pandas as pd
import osos.chdir('/Users/zheng/Desktop/')
xl = pd.ExcelFile('工作簿1.xlsx')
df = xl.parse('工作表1')
print(df)name  age  cur1_trial1  ...  cur2_trial1  cur2_trial2  cur2_trial3
0  jane   20           74  ...          NaN         88.0           89
1   tom   23           65  ...         78.0         82.0           48
2  mike   21           90  ...          NaN          NaN           87[3 rows x 8 columns]

转换成数据表

df_melt = df.melt(id_vars=['name','age'])
df_melt.head()
Out[6]: name  age     variable  value
0  jane   20  cur1_trial1   74.0
1   tom   23  cur1_trial1   65.0
2  mike   21  cur1_trial1   90.0
3  jane   20  cur1_trial2    NaN
4   tom   23  cur1_trial2   66.0

好了,接下来可以先筛选掉那些空值

df_filtered = df_melt[pd.notna(df_melt['value'])]
df_filtered.head()
Out[8]: name  age     variable  value
0  jane   20  cur1_trial1   74.0
1   tom   23  cur1_trial1   65.0
2  mike   21  cur1_trial1   90.0
4   tom   23  cur1_trial2   66.0
5  mike   21  cur1_trial2   91.0

之前id=3的那一行已经被过滤了。接下来我们要求平均数

那如果是在excel里面我们可以用到averageifs,当然了我不知道Excel对于求标准差,方差,样本估算总体方差,中值,1st quater,3rd quater,极差……等等等等这些东西有没有ifs函数,毕竟我不care。

况且上面的数据还有个坑,我把两列数据合并成一列了(cur1_trial1是两个东西:科目和试验次数) :)

不用担心,可以用.str.split

df_splitted = df_filtered['variable'].str.split('_',expand=True)
df_splitted
Out[17]: 0       1
0   cur1  trial1
1   cur1  trial1
2   cur1  trial1
4   cur1  trial2
5   cur1  trial2
6   cur1  trial3
7   cur1  trial3
10  cur2  trial1
12  cur2  trial2
13  cur2  trial2
15  cur2  trial3
16  cur2  trial3
17  cur2  trial3

配合改个名

df_splitted = df_splitted.rename({0:'curriculum',1:'trial'},axis=1)
df_splitted.head()
Out[23]: curriculum   trial
0       cur1  trial1
1       cur1  trial1
2       cur1  trial1
4       cur1  trial2
5       cur1  trial2

ok,现在把df_filtered和df_splitted合并一下

df_comb = pd.concat([df_filtered,df_splitted],axis=1)
df_comb.head()
Out[25]: name  age     variable  value curriculum   trial
0  jane   20  cur1_trial1   74.0       cur1  trial1
1   tom   23  cur1_trial1   65.0       cur1  trial1
2  mike   21  cur1_trial1   90.0       cur1  trial1
4   tom   23  cur1_trial2   66.0       cur1  trial2
5  mike   21  cur1_trial2   91.0       cur1  trial2

注意到两个axis=1,这是设置操作的方向。大体上来说,0就是默认的,1呢,就是换一个方向。

接下来回到求平均值的问题

df_comb.groupby(['name','curriculum','age']).mean()
Out[30]: value
name curriculum age
jane cur1       20   77.000000cur2       20   88.500000
mike cur1       21   90.500000cur2       21   87.000000
tom  cur1       23   64.000000cur2       23   69.333333

所以呢,这个按姓名和课程的分组就搞定了,多容易。

类似的:

一行变多行:路人乙小明:[python]Shit, 我完全不明白为什么这么做会work,但是it worked!

万能的apply:路人乙小明:[pandas]emm……一旦你接受了这个设定:pandas的apply

pandas追加写入excel_[Excel]如果你爱Excel,请学好pandas相关推荐

  1. pandas追加写入excel_快速介绍Python数据分析库pandas的基础知识和代码示例

    "软件工程师阅读教科书作为参考时不会记住所有的东西,但是要知道如何快速查找重·要的知识点." 为了能够快速查找和使用功能,使我们在进行机器学习模型时能够达到一定流程化.我创建了这个 ...

  2. pandas追加写入行、列

    文章目录 追加写入行 追加写入列 追加写入行 import pandas as pdfor i in range(2):x = [1, 2, 3, 4]df = pd.DataFrame(x)df.t ...

  3. python 写入excel_一行一行整理EXCEL表太麻烦,试试python脚本,1秒写入数据

    最近工作中,要整理数据,本来是以sql脚本录入,但是id.barcode等数据不好整理,因为这几个字段要唯一. 所以想到用EXCEL表整理数据,再导入数据库中. 整理的过程中,发现EXCEL一行一行的 ...

  4. python 写入excel_基于Python实现Excel的读写

    LabVIEW:2018 Python:3.6.0 xlrd:1.2.0 xlwt:1.3.0 Python的强大不需要我来解释,人生苦短,我用python!自行学习之后总想把它在工作中慢慢用起来,L ...

  5. java把图片写入excel_使用POI向excel中写入图片的java代码

    List headlist = this.getCS_HEAD(allFactoryNo); HSSFSheet sheet = workbook.createSheet(); sheet.setCo ...

  6. Excel数据合并(追加写入)

    Excel数据合并(追加写入) 数据合并 两表合并 只用pandas包实现 用xlrd包实现 普通的文件读写 总结 多表数据合并 数据合并 两表合并 已知a c两个都含有数据的xlsx文件要求:将a文 ...

  7. python导入excel类库_Python中使用第三方库xlutils来追加写入Excel文件示例

    Python中使用第三方库xlutils来追加写入Excel文件示例 目前还没有更好的方法来追写Excel,lorinnn在网上搜索到以及之后用到的方法就是使用第三方库xlutils来实现了这个功能, ...

  8. pandas输出到excel_学Python还不会处理Excel数据?带你用pandas玩转各种数据处理

    开场白 以前学习 Python 的 pandas 包时,经常到一些 excel 的论坛寻找实战机会.接下来我会陆续把相关案例分享出来,还会把其中的技术要点做详细的讲解. 本文要点: 使用 xlwing ...

  9. JS+Selenium+excel追加写入,使用python成功爬取京东任何商品

    之前一直是requests库做爬虫,这次尝试下使用selenium做爬虫,效率不高,但是却没有限制,文章是分别结合大牛的selenium爬虫以及excel追加写入操作而成,还有待优化,打算爬取更多信息 ...

最新文章

  1. GDCM:gdcm::VM的测试程序
  2. Linux文件基本操作管理
  3. IE兼容问题 动态生成的节点IE浏览器无法触发
  4. 识别SDN中的安全隐患
  5. unity3d 简单动画
  6. java 学生课程成绩_Java课设--学生成绩管理系统一
  7. pytorch-LSTM的输入和输出尺寸
  8. 相约金陵丨7月9日,云和恩墨大讲堂 · 南京站邀您共论数字化转型实践
  9. 嵌入式Linux要学哪些东西?你真的造吗?
  10. git还原历史版本代码
  11. MAC安装ant的办法
  12. 天锐绿盾加密软件如何制作外发文件
  13. 【每日随笔】飞书云文档使用 ( 注册飞书云文档账号 | 创建云文档 | 分享云文档 )
  14. 字符编码集与ASCII码表
  15. html文章标题列表,内容页(文章及产品页)标题该怎么写
  16. 设计模式--桥接模式
  17. 【数据库】车牌识别数据库(CCPD数据集)
  18. 怎么给电脑安装window7系统呢
  19. MOOC《程序设计入门——C语言》错题集
  20. 正点原子OLED显示实验

热门文章

  1. 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)
  2. AGC002(D~F)【Kruskal重构树,博弈论,dp】
  3. UOJ#33-[UR #2]树上GCD【长链剖分,根号分治】
  4. P3690-[模板]Link Cut Tree(动态树)【Splay】
  5. 2018/7/7-纪中某C组题【jzoj1494,jzoj1495,jzoj1496,jzoj1497】
  6. The 2020 ICPC Asia Macau Regional Contest A. Accelerator(分治+NTT)
  7. Codeforces Round #676 (Div. 2) E待补
  8. 【dfs】病毒(jzoj 1284)
  9. 14、mysql中事务的应用
  10. Linux查找含有某字符串的所有文件