用Pandas代替Excel做数据分析
接触Pandas有一段时间了,之前只是简单的小打小闹一下,真正要最后出统计表、画图还是用Excel,Excel的优点是直观,全图形操作,缺点是繁琐,如果有些重复性的东西,拖拖拉拉要搞半天,效率很低。
这两天刚好就遇到这种重复性的繁琐工作,虽然Pandas还不是很熟,但是想到用Excel处理那么多个文件,重复点来点去,有点害怕,硬着头皮上了Pandas,第一次用于实际工作。
其实任务也很简单,就是把多个Excel数据表用同样的方式整理一遍,然后画出一个统计图,中间涉及一个基础数据表的连接,我之前不会用Excel操作,都是导入数据库用SQL join的,现在连导入数据库都省了,全部通过Pandas完成。
涉及的一些操作,简单记下来,以后或许经常用:
1、读入Excel表,直接用 pd.read_excel() 函数即可。 如果不想要原来的标题,可以设置 header=None,skiprows=[0],names=['col1','col2'] 自己指定标题,当然也可以读进来再改标题,但是如果要读好几个一样的,然后连起来,如果标题不同,连不起来。 如果是读csv,内容是数字格式的文本,还可以加上 dtype=str 就不会把文本当成数字处理
2、表连接,用 df.merge() 函数,例如: df.merge(df2,how='left',left_on=['col1'],right_on=['col2']) 就是把df1和df2通过col1和col2的值连接起来,跟SQL中的 SELECT * FROM df1 LEFT OUTER JOIN df2 ON df1.col1=df2.col2 效果相同
3、排序,用 df.sort_values() 函数 例如: df.sort_values(by=['col1'],ascending=False,inplace=True) 跟SQL的 SELECT * FROM df ORDER BY col1 DESC 效果相同 pandas比SQL厉害之处在于,它还可以对列进行排序,只要在参数里加上 axis=1 即可
4、选取前20行,直接用冒号操作即可 df[:20]
5、两列字符串连接生成新的一列
df['col3'] = df['col1']+df['col2'] 即可,不过这样操作,会提示 A value is trying to be set on a copy of a slice from a DataFrame 实际上没问题的,关于这个警告,很多讨论,但是似乎没啥解决方法 https://stackoverflow.com/questions/12555323/adding-new-column-to-existing-dataframe-in-python-pandas Stack Overflow上的回答,更新了两次,但是除了2017版本,其他都有警告。 2017版本用了DataFrame的assign函数,文档如下: http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.assign.html 它是返回一个新的DataFrame,没有在原来的DataFrame上修改,这种方式不会有警告,但是可能会占用更多内存。 df_new = df.assign(col3=df['col1']+df['col2'])
6、根据字符串查找,类似SQL里的LIKE查找:
df[df['a'].str.contains('b')] 相当于 SELECT * FROM df WHERE a like '%b%' 这个contains只是str里的一个函数,支持正则表达式,还有很多各种函数,跟string里的差不多。
7、nan的处理
pandas处理Excel的空值似乎有bug,出现了很多小写的“nan”,这些“nan”跟“NaN”是不一样的。 首先要判断这个nan究竟是空值还是字符串,如果是字符串,就按照字符串来处理,如果是空值就按照空值来处理。 例如,一个DataFrame的行索引出现了一个nan,通过df.index显示出来,发现这个nan是个‘nan’,也就是普通字符串,那么要把这一行删除,只需要像普通行那样,通过索引名引用删除即可:
df.drop(['nan'],axis=0,inplace=True)
如果某个列名也出现了nan,通过df.columns显示这个是个nan,不是字符串,而是空值,那么要删除这一列,就要通过选择其他列的方式来实现:
df[df.columns[df.columns.notnull()]]
8、转变表格的显示方式
Excel中要画多个系列的折线图,需要把系列名称或横坐标轴标签作为行标题或列标题,把数值作为表格内容,如下所示:
A | B | C | |
---|---|---|---|
甲 | 1 | 2 | 3 |
乙 | 4 | 5 | 6 |
丙 | 7 | 8 | 9 |
如果表格的内容如下:
类别1 | 类别2 | 数量 |
---|---|---|
甲 | A | 1 |
乙 | B | 5 |
…… | …… | …… |
就要用
df.pivot()
函数转为上面那种格式。 pivot()函数很直接,直接就是指定哪个是索引,哪个是列,哪个是值:
df.pivot(index='类别1',columns='类别2',values='数量')
这样就把第二种表格转成了第一种。
也可以通过unstack()函数实现,不过这个函数是针对索引的,如果要用这个函数的话,就要先更改表格的索引,比较麻烦。
相关文章
- 硅谷互联网公司的开发流程
开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro
- RESTful-表述性状态转移风格
REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表->就是产品资源 最重要的是如何表示一个资源 地址即
- 稳定性思考
产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能
- Supervisor守护队列发邮件
安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et
- 安装libsodium,让服务器支持chacha20等加密方式
用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod
随机推荐
- 硅谷互联网公司的开发流程
开发流程包括这么几个阶段: OKR 的设立; 主项目及其子项目的确立; 每个子项目的生命周期; 主项目的生命周期; 收尾、维护、复盘。 第一点,OKR 的设立 所有项目的起始,都应该从 Ro
- RESTful-表述性状态转移风格
REST英文全拼:Representational State Transfer 面向资源编程 资源指的就是一类数据 产品表->就是产品资源 最重要的是如何表示一个资源 地址即
- 稳定性思考
产品功能线 0-1: 当系统从无到有的时候,首要考虑的是研发效率,功能快速迭代,满足快速增长的业务需求 1-10 系统已经搭建起来,此时考虑的是系统的稳定性。 可用性:1.隔离:区分出核心和非核心功能
- Supervisor守护队列发邮件
安装 CentOS: yum -y install supervisor Debien/Ubuntu适用:apt-get install supervisor 配置 修改主配置文件:vim /et
- 安装libsodium,让服务器支持chacha20等加密方式
用chacha20加密方式需要安装libsodium 注意:libsodium从1.0.15开始就废弃了aes-128-ctr yum install wget m2crypto git libsod