先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python。最好就是一句python,对应写一句R。
pandas可谓如雷贯耳,数据处理神器。
以下符号:
=R=
代表着在R中代码是怎么样的。
pandas 是基于 Numpy 构建的含有更高级数据结构和工具的数据分析包
类似于 Numpy 的核心是 ndarray,pandas 也是围绕着 Series 和 DataFrame 两个核心数据结构展开的 。Series 和 DataFrame 分别对应于一维的序列和二维的表结构。pandas 约定俗成的导入方法如下:
预先加载:
from pandas import Series,DataFrame import pandas as pd
本图来源于:https://s3.amazonaws.com/assets.datacamp.com/blog_assets/PandasPythonForDataScience+(1).pdf
————————————————————————————————————-
一、Series 和 DataFrame构成
1、series构造
s = Series([1,2,3.0,'abc']) #object可以多格式,像list(c(1,2,3.0,'abc'));dtppe为单种格式 s = Series(data=[1,3,5,7],index = ['a','b','x','y']) #其中Index=rownames s.index #=R=rownames(s) s.values #=R=s s.name #colnames列名之上名字 s.index.name #rownames行名之上名字
python很看重index这个属性,相比之下R对于索引的操作明显要弱很多。在延伸中提到对索引的修改与操作。
2、dataframe构造
data = {'state':['Ohino','Ohino','Ohino','Nevada','Nevada'], 'year':[2000,2001,2002,2001,2002], 'pop':[1.5,1.7,3.6,2.4,2.9]}
大括号代表词典,有点像list,可以自定义数列的名字。
df=DataFrame(data)
其中DataFrame(data=None,index=None,columns=None)其中index代表行名称,columns代表列名称
其中df.index/df.columns分别代表行名称与列名称:
df.index #行名 df.columns #列名
其中index也是索引,而且不是那么好修改的。
————————————————————————————————————-
二、以某规则重排列.reindex
1、series
series.reindex(index,method,fill_values) s.reindex(index=[2,1,3,6]) #类似order重排列 此时,按照2,1,3的顺序重新排列 s.reindex(index=[2,1,3,6],fill_value=0) #fill_value插补方式,默认NaN,此时为0 s.reindex(index=[2,1,3,6],fill_value=0,method="backfill") #method:{'backfill', 'bfill', 'pad', 'ffill', None}(ffill = pad,bfill = back fill,分别指插值时向前还是向后取值)
2、dataframe
#dataframe索引,匹配,缺失值插补 dataframe.reindex(index,columns,method,fill_values) #插值方法 method 参数只能应用于行,即轴 0 state = ['Texas','Utha','California'] df.reindex(columns=state,method='ffill') #只能行插补 df.T.reindex(index=[1,6,3],fill_value=0).T #列插补技巧
————————————————————————————————————-
三、切片与删除、增加操作与选中
dataframe实质是numpy的高阶表现形式。如果选中也是很讲究,这个比R里面的dataframe要复杂一些:
两列:用irow/icol选中单个;用切片选择子集 .ix/.iloc
选择列:
#---1 利用名称选择列--------- data['w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型 data.w #选择表格中的'w'列,使用点属性,返回的是Series类型 data[['w']] #选择表格中的'w'列,返回的是DataFrame类型 data[['w','z']] #选择表格中的'w'、'z'列 #---2 利用序号寻找列--------- data.icol(0) #取data的第一列 data.ix[:,1] #返回第2行的第三种方法,返回的是DataFrame,跟data[1:2]同
利用序号选择的时候,注意[:,]中的:和,的用法
选择行:
#---------1 用名称选择----------------- data['a':'b'] #利用index值进行切片,返回的是**前闭后闭**的DataFrame, #即末端是包含的 data[0:2] #返回第1行到第2行的所有行,前闭后开,包括前不包括后 #--------跟data.table一样,可以不加逗号选中----------- data[1:2] #返回第2行,从0计,返回的是单行,通过有前后值的索引形式, #如果采用data[1]则报错 data.ix[1,:] #返回第2行的第三种方法,返回的是DataFrame,跟data[1:2]同 data.irow(0) #取data的第一行 data.iloc[-1] #选取DataFrame最后一行,返回的是Series data.iloc[-1:] #选取DataFrame最后一行,返回的是DataFrame
其中跟R中的data.table有点像的是,可以通过data[1],就是选中了第一行。
1、切片-定位
python的切片要是容易跟R进行混淆,那么现在觉得区别就是一般来说要多加一个冒号:
R中: data[1,] python中: data[1,:]
一开始不知道切片是什么,其实就是截取数据块。其中还有如何截取符合条件的数据列。
s[1:2] #x[2,2] df.ix[2,2] #df[3,3] df.ix[2:3,2:3] df.ix[2,"pop"] #可以用列名直接定位 df["pop"] df[:2] #横向第0行,第1行 df[df["pop"]>3] #df[df$pop>3]
跟R很大的区别,就是python中是从0开始算起。
同时定位的时候需要加入data.ix这个.ix很容易被忽略。
其中注意:
负向切片是需要仔细了解的:
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] >>> L[-2:] ['Bob', 'Jack'] >>> L[-2:-1] ['Bob']
2、删除
s.drop(1) #去掉index为1的行 df.drop(names,axis=0) #axis=0代表行,=1代表列;names代表列名(colnames)或者行名(rownames)
drop(colnames/rownames,axis=0/1)代表按行、按列删除。
3、增加
df.ix[5,:]=[3,"Nevada",3000]选中之后,填入数据,当然数值很多情况下,应该用合并的操作了。
————————————————————————————————————-
四、排序与排名
1、排序
foo.order(ascending=False) #按值,降序,ascending=True代表升序 foo.sort(ascending=False) #按index
也有两个,order和sort。其中sort_index是按照Index进行排列。
Series 的 sort_index(ascending=True) 方法可以对 index 进行排序操作,ascending 参数用于控制升序或降序,默认为升序。若要按值对 Series 进行排序,当使用 .order() 方法,任何缺失值默认都会被放到 Series 的末尾。在 DataFrame 上,.sort_index(axis=0, by=None, ascending=True) 方法多了一个轴向的选择参数与一个 by 参数,by 参数的作用是针对某一(些)列进行排序(不能对行使用 by 参数)。
df.sort(axis=0,ascending=False,by=None) #按index,比series 多了axis,横向纵向的功能 #by默认为None,by 参数的作用是针对某一(些)列进行排序(不能对行使用 by 参数) #by两个,df.sort_index(by=['California','Texas'])
dataframe的排序
2、排名rank
Series.rank(method='average', ascending=True) #返回的是名次的值value #处理平级项,方法里的 method 参数就是起这个作用的,他有四个值可选:average, min, max, first dataframe.rank(axis=0, method='first', ascending=True) #按行给出名次
排名(,ascending=False)