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

0f72d6811f665afbfd39367724d23b0f.png

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

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

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

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

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

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

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

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

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

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

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


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

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

9f78bd2d8b934bbaf7fa1fa31dc217a6.png
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次。所以成绩登记出来是下面这样的:

b2f1fcca51743bc5fc3d8629cf84f705.png

如果现在要求空白数据不纳入分析(比如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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转:Redis 集群搭建详细指南

转自: https://www.cnblogs.com/mafly/p/redis_cluster.html 【README】 非常棒的一篇文章,感谢作者的分享; 先有鸡还是先有蛋? 最近有朋友问了一个问题,说毕业后去大城市还是小城市?去大公司还是小公…

快速排序算法思想及实现

简介 快速排序是对冒泡排序的一种改进,是一种分治算法,时间复杂度为O(nlogn) 基本思想 先从数列中取出一个数作为基准数。分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。再对左右区间重复第二步&a…

作为架构师,你必需要搞清楚的概念:POJO、PO、DTO、DAO、BO、VO

转载自 作为架构师,你必需要搞清楚的概念:POJO、PO、DTO、DAO、BO、VOPOJO、PO、DTO、DAO、BO、VO这些概念作为Java开发来说应该全部或者部分遇到过,作为架构师的你想必更是清楚这些概念在不同场景的应用。下面我逐一介绍一下,想必…

搭建redis集群

【README】 redis集群搭建有很多坑儿,注意; 【1】坑er 集合 坑儿1、 [ERR] Sorry, cant connect to node 192.168.163.203:6381 报错现场:执行如下命令新建集群,报错如下; /usr/local/redis-cluster/bin/redis-t…

怎么看cudnn的版本好_针对此次版本削弱,怎么用好嫦娥!

大招的费蓝 & 蓝量伤害比 (先把嫦娥的冷门知识点放置顶,干货感比较重要)嫦娥100%蓝时,所有造成的伤害均要2倍,蓝量每下降1%,伤害倍数就下降2%。即嫦娥在50%蓝的时候,伤害就不加倍了。嫦娥最…

设计模式(一):工厂方法

目录概括目的主要解决何时使用使用场景总结三种工厂模式的对比代码示例概括 定义一个用于创建对象的接口,让子类决定实例化哪一个类。使用特殊的工厂方法代替对于对象构造函数的直接调用(即使用 new运算符,工厂方法 使一个类的实例化延迟到其…

mysql查询优化explain命令详解

转载自 mysql查询优化explain命令详解mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式。explain翻译即解释,就是看mysql语句的查询解释计划,从解释计划我们能很清楚的看到解释的语句有没有合理用到索引,扫…

sftp工具都有哪些_学霸们都在用哪些科研工具?

这是 社科学术圈 推送的第1677篇文章学者论文哪里找?论文怎么写?会用到哪些工具?本期将带来有助于提高论文写作效率的一些资料,包括OA论文、思路整理、词典类、制图工具类、文献生成类等方面。OA论文平台1. PMC(Pubmed Cenral)Pub…

redis集群搭建报错-(error) CLUSTERDOWN The cluster is down

【README】 最近搭建一个redis集群,参考博文 (https://www.cnblogs.com/mafly/p/redis_cluster.html) 对集群配置后,master, slave 也启动起来,但无法插入数据; 【1】报错信息; [r…

常用加密算法解析

转载自 常用加密算法解析 今天介绍下工作当中常用的加密算法、分类、应用。 1、对称加密算法 所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。 分类…

双指针:88. 合并两个有序数组

题目链接 88. 合并两个有序数组 解题思路 一. 合并数组后排序&#xff0c;时间复杂度为O((nm)log(nm)) 代码&#xff1a; 快排详解 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {for(int im,j0;i<mn;i,j){nums1[i] nums2[j];}quickSor…

bmp180气压传感器工作原理_陕西压力传感器的工作原理信息推荐

压力传感器的工作原理应用广泛的是压阻式压力传感器&#xff0c;它具有极低的价格和较高的精度以及较好的线性特性。下面我们主要介绍这类陕西压力传感器。在了解陕西压力传感器时&#xff0c;我们首先认识一下电阻应变片这种元件。电阻应变片是一种将被测件上的应变变化转换成…

转-rsa加密算法

转自 阮一峰&#xff1b; http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html 一、一点历史 1976年以前&#xff0c;所有的加密方法都是同一种模式&#xff1a; &#xff08;1&#…

设计模式之单例模式实践

转载自 设计模式之单例模式实践概念单例模式即一个JVM内存中只存在一个类的对象实例分类1、懒汉式 类加载的时候就创建实例 2、饿汉式 使用的时候才创建实例当然还有其他的生成单例的方式&#xff0c;双重校验锁&#xff0c;枚举和静态内部类&#xff0c;文中会有介绍实践懒汉式…

win7精简_低配电脑的福音:这款小众系统10GB+极限精简+不卡顿,比Win7还快!

自win7停服后&#xff0c;不少用户私信老毛桃&#xff0c;问win10哪个版本的系统好用。这让我怎么回答呢&#xff0c;不同的使用要求安装的系统不一样&#xff0c;但总的来说&#xff0c;世界上没有最完美的系统&#xff0c;只有最适合自己的系统。也有不少用户在评论win10各种…

快慢指针:141. 环形链表(判断是否存在环路)

题目描述 给定一个链表&#xff0c;判断链表中是否有环 题目链接 141. 环形链表 解题思路 使用快慢指针&#xff08;Floyd判圈算法&#xff09;&#xff1a;从链表的头部设置两个指针&#xff0c;p1的步长为1&#xff0c; p2的步长为2&#xff0c;同时向前走&#xff0c;如…

redis集群信息分析-cluster info-cluster nodes

【README】 本文po出 redis集群的节点信息&#xff0c;槽信息&#xff0c;以及字段含义 【1】集群信息 192.168.163.203:6380> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluste…

彻底理解正向代理和反向代理

转载自 彻底理解正向代理和反向代理平时工作中我们会接触到各种代理&#xff0c;它到底是什么概念呢&#xff0c;又是什么工作原理&#xff0c;下面我们具体来分析一下。1、概念正向代理这个很好理解&#xff0c;比如说你现在要访问一个外国的社交网站www.facebook.com&#xf…

查看电脑重启日志_系统日志看硬盘故障图文教程,电脑日志查看磁盘硬盘坏道问题方法...

大家好&#xff0c;我是老盖&#xff0c;感谢观看本篇文章&#xff0c;本文做的也有视频&#xff0c;也可以看我发布的视频。今天和大家讲一下通过电脑的系统日志&#xff0c;判断硬盘是否有问题的一个方法&#xff0c;最近这几天我这个电脑偶尔会卡一下&#xff0c;有的时候还…

redis集群依赖ruby

【README】 redis集群依赖ruby&#xff0c;需安装ruby环境&#xff0c;ruby版本需高于2.2。在创建redis集群前&#xff0c;需要安装ruby &#xff0c;命令如下 yum install ruby yum install rubygems gem install redis 【1】什么是 rubygems 转自 https://www.jianshu.c…