数据结构的重新认识——Python(pandas包)学习笔记

      学习过Python的应该都听过Pandas、Numpy、matplotlib三剑客,其中Pandas在搞数据统计与可视化的圈子里更是久负盛名。怀着一种期待的心情,我对Pandas进行了为期1个月的学习,但是令我震惊的是,第一周的学习竟然毫无进展,以之前对数据结构的理解,我无法看懂Pandas包对数据的处理方式。因此我在后来的一周内结合网上的资料对数据结构的知识进行了重新的解读,发现之前的认知存在以下的误区,由于长期使用Excel等二维表格为数据载体的数据软件(貌似SPSS和SAS里的表单也是二维的),先入为主的认为数据结构只有二维一种形式(真好奇当年我线性代数是怎么考及格的),而真实的数据结构可以从一维到三维,有需要甚至可以折叠为任意多维度(是不是听起来有点科幻的感觉),在Pandas中常用的数据结构(array)有3个维度(dim):一维数组Series,二维数组DataFrame,三维数组Panel。各种数组之间可以通过.shape()函数进行维度转换(有没有《三体》里弹星者手里的二相箔的感觉)。有了这个认识以后,后两周的学习可以说是顺风顺水了。

       接下来记录一下我对pandas的学习过程。学习的内容分为以下几块:

  1. 数据的导入;
  2. 数据的处理;
  3. 数据与结果的输出。

      另外如何导入包的方法我这里就略去不讲了,在之前的帖子里有介绍。还有就是每次使用任何包之前一定要先引入,例如:

import pandas as pd

      1. 首先是数据的导入。日常接触的数据一般就是CSV或者Excel,再者要么就是Access,其他的数据库类型往往也能转成CSV或者Excel,所以能解决CSV和Excel就能搞定日常工作中95%的数据处理工作了。

##导入CSV数据库
aa=pd.read_csv(r'D:\test.csv',low_memory=False,encoding='gbk')

      pd是pandas库引入后的重命名缩写,.read_csv()中用很多的可用参数,但是常用的就是这三个,第一个参数是需要导入的文件路径,需要注意的是(1)路径前的r不能少;(2)如果采用相对路径的话(只写Excel的文件名),那文件必须存放在Python的安装目录下去(一般不建议用这个方法)。第二个参数是设定节省内存模式,如果数据量较大的话把low_memory=False。第三个参数是设定读入文件的编码格式,能解决导入后中文显示为乱码的问题。涉及中文的编码常见的有3种:utf-8、gbk和GB18030,其中utf-8是Linux系统中的中文编码默认格式,gbk是Windows系统中文默认编码格式,GB18030是省慢病监测系统中的中文编码格式(当年为了能够让地名中的生僻字显示而不得不采用的编码系统)。

##导入excel数据库
bb=pd.read_excel(r'D:\test.xls',sheetname=u'Sheet1',encoding='gbk')

       .read_excel()里常用参数也是3个,但是low_memory没有了。第一个参数是导入文件路径。第二个是工作簿名,注意在引号前的那个u,对中文字符的识别有帮助,建议都不要省略。第三个参数是设定编码格式。

       导入10万上下的数据时,SAS耗时约5-6s,而Python耗时约30s左右,差异不是太明显,也许数据量还要进一步增加才会有感觉吧。此外SAS建立数据库是保存在硬盘上的(默认文件夹或者指定的逻辑库存储路径),所以只有硬盘满了才会导致数据导入失败;而Python是直接读入内存的,所以内存满了就会导入报错。生成的aa/bb是一个类似序列结构的pd.DataFrame字典对象,在习惯中类似SAS中的数据库。复制该对象可以采用

bb=aa.copy()

       2. 数据库导入完成,进入下个阶段数据清理。

        2.1 查看该数据库的字段名及类型、数据库行数

aa.dtypes     ##注意不要漏了s
aa.index       ##显示数据库的行数
##注意dtypes和index后面不能加括号,即没有参数

        2.2 查看整个数据库,在SAS中用Proc print,或者直接去数据库视图里查询

print(aa)    ##或者直接输入aa也是同样的效果,数据量大的情况下,中间部分会用省略号省略
##查看数据库前n条(后n条)
aa.head(n)
aa.tail(n)     ##如果n不输入,则默认为n=5

        2.3 快速统计,类似于SAS里的Proc means或者Proc univariate

aa.describe()   ##括号内选特定字段,字段名大小写敏感,置空默认全部字段参与统计

        2.4 数据转置,类似SAS中的Proc transpose

aa.T  ##索引项变成字段名,字段名变成索引项

        2.5 排序,类似于SAS中的Proc sort

aa.sort_index(axis=1,ascending=False)   ##括号内参数可以不填,取默认值
aa.sort_values(by='a',ascending=False)   ##括号内参数by必填

        2.6 以下是数据库操作部分,类似SAS中的data步 

aa['a']   ##保留特定字段,此时DataFrame会降维成为一维数组Series,同时索引也会被保留(如果有索引的话)类似SAS中的keep=
aa[(aa.a<5)&(aa.b=='abc')]  ##类似于SAS里的where语句,同时要注意字段的类型,取值时要
                           ##用“==”来判断,多个条件组合时,and采用“&”,or采用“|”,同时注意条件用括号来分隔
aa.pop('a')  ##删除特定字段,只能删除一个,类似SAS中的drop=
aa.append(bb,ignore_index=True)  ##纵向合并,类似于SAS里的set,默认情况下无法合并(ignore_index=False)

       2.7 取值与替换,比如类似Excel里的=left()/right()/mid()函数,SAS里的substr()函数

##Python中的取值一般先将对象视作一个数组,然后采用数组的切片方法来处理,
##例如arr[0,3](数组中的每一个元素从第0位开始取到第3位)
##注意DataFrame不是一个数组,所以没有.str的方法,直接切片的结果是DataFrame表的一部分,
##如果要对字段内部进行切片取值的话,需要需要降维为Series.str
aa['a'].str[0,4]

##特定值的替换,inplace=True可以使替换后的结果覆盖原来的表格
aa.replace(to_place='',value='',inplace=True)

##数据库中去除空格
##方法1:能去除字段中间的空格
aa['d']=aa['c'].apply(lambda x: np.NaN if str(x).isspace() else x)

##方法2:只能去除字段头尾的空格
aa['e']=aa['c'].str.strip()

##方法3:全表所有字段的空格一次性去除,包括字段中间的空格
aa.replace(to_place='',value='',inplace=True)

        2.8 字段的重命名(SAS中的rename=),尽管SASV9以后对中文的友好程度大大增加,但是中文名做字段名始终是SAS不肯突破的底线,所以SAS在建数据库之前总是要花很大力气去编一些既要短又要好记的英文字段名,否则只能忍受诸如“_col0”此类的字段名,或者写大段的format函数来做label。相比之下Python似乎对中文要友好很多,中文字段名可以直接引用,当然前提是你转码要没问题,否则你也要面对一长串的“Á¬½ÓÊý¾Ý¿”干瞪眼。

##重命名的方法最常用的有两种,假设aa有3个字段'a','b','c':
##一种是暴力枚举法
aa.columns=['aa1','aa2','aa3']  ##不管原来3个字段字段名是什么全部被强制重命名了,但是缺点是
                          ##如果命名数量不等于aa中原有字段数量,会导致报错,所以一般不建议

##另一种是精准定点法
aa.rename(columns={'a':'aa1','c':'aa3'},inplace=True) ##这种方法的好处是想改哪个就改哪个,想改几个就改几个

        2.9 数据透视表,分组汇总,类似Excel中的数据透视表和SAS中的proc freq

##用.groupby()分组时,若分组变量大于等于2个时,应加上方括号(表示是一个数组)
bb=aa['a'].groupby([aa['b'],aa['c']).count()

        3 数据导出

##数据导出为Excel
bb['a'].to_excel(r'D:\bb.xls',sheet_name='bb')

##数据导出为CSV
bb['a'].to_csv(r'D:\bb.xls')

       由于时间和篇幅所限,学习的内容没有完全列入文中,后期有时间再做进一步的整理与补充。总体来说,Pandas的功能很强大,代码很简洁,数据处理的效率高,但是相对Excel等入门级软件来讲,需要有较好的数学功底和数据结构概念来支持,至少线性代数得好好学一下吧。看样子要学好Python,线性代数和微积分真要去回炉一下了。

转载于:https://my.oschina.net/facewall123/blog/1593941

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值