先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python。最好就是一句python,对应写一句R。

pandas可谓如雷贯耳,数据处理神器。

以下符号:

=R=

代表着在R中代码是怎么样的。

pandas 是基于 Numpy 构建的含有更高级数据结构和工具的数据分析包

类似于 Numpy 的核心是 ndarray,pandas 也是围绕着 Series 和 DataFrame 两个核心数据结构展开的 。Series 和 DataFrame 分别对应于一维的序列和二维的表结构。pandas 约定俗成的导入方法如下:

预先加载:

  1. from pandas import Series,DataFrame
  2. import pandas as pd

本图来源于:https://s3.amazonaws.com/assets.datacamp.com/blog_assets/PandasPythonForDataScience+(1).pdf

————————————————————————————————————-

一、Series 和 DataFrame构成

1、series构造

  1. s = Series([1,2,3.0,'abc']) #object可以多格式,像list(c(1,2,3.0,'abc'));dtppe为单种格式
  2. s = Series(data=[1,3,5,7],index = ['a','b','x','y']) #其中Index=rownames
  3. s.index #=R=rownames(s)
  4. s.values #=R=s
  5. s.name #colnames列名之上名字
  6. s.index.name #rownames行名之上名字

python很看重index这个属性,相比之下R对于索引的操作明显要弱很多。在延伸中提到对索引的修改与操作。

2、dataframe构造

  1. data = {'state':['Ohino','Ohino','Ohino','Nevada','Nevada'],
  2. 'year':[2000,2001,2002,2001,2002],
  3. 'pop':[1.5,1.7,3.6,2.4,2.9]}

大括号代表词典,有点像list,可以自定义数列的名字。

  1. df=DataFrame(data)

  1. 其中DataFrame(data=None,index=None,columns=None)其中index代表行名称,columns代表列名称

其中df.index/df.columns分别代表行名称与列名称:

  1. df.index #行名
  2. df.columns #列名

其中index也是索引,而且不是那么好修改的。

————————————————————————————————————-

二、以某规则重排列.reindex

1、series

  1. series.reindex(index,method,fill_values)
  2. s.reindex(index=[2,1,3,6]) #类似order重排列 此时,按照2,1,3的顺序重新排列
  3. s.reindex(index=[2,1,3,6],fill_value=0) #fill_value插补方式,默认NaN,此时为0
  4. s.reindex(index=[2,1,3,6],fill_value=0,method="backfill")
  5. #method:{'backfill', 'bfill', 'pad', 'ffill', None}(ffill = pad,bfill = back fill,分别指插值时向前还是向后取值)

2、dataframe

  1. #dataframe索引,匹配,缺失值插补
  2. dataframe.reindex(index,columns,method,fill_values) #插值方法 method 参数只能应用于行,即轴 0
  3. state = ['Texas','Utha','California']
  4. df.reindex(columns=state,method='ffill') #只能行插补
  5.  
  6. df.T.reindex(index=[1,6,3],fill_value=0).T #列插补技巧

————————————————————————————————————-

三、切片与删除、增加操作与选中

dataframe实质是numpy的高阶表现形式。如果选中也是很讲究,这个比R里面的dataframe要复杂一些:

两列:用irow/icol选中单个;用切片选择子集 .ix/.iloc

选择列:

  1. #---1 利用名称选择列---------
  2. data['w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型
  3.  
  4. data.w #选择表格中的'w'列,使用点属性,返回的是Series类型
  5.  
  6. data[['w']] #选择表格中的'w'列,返回的是DataFrame类型
  7.  
  8. data[['w','z']] #选择表格中的'w'、'z'列
  9.  
  10. #---2 利用序号寻找列---------
  11. data.icol(0) #取data的第一列
  12. data.ix[:,1] #返回第2行的第三种方法,返回的是DataFrame,跟data[1:2]同

利用序号选择的时候,注意[:,]中的:和,的用法

选择行:

  1. #---------1 用名称选择-----------------
  2. data['a':'b'] #利用index值进行切片,返回的是**前闭后闭**的DataFrame,
  3. #即末端是包含的
  4.  
  5. data[0:2] #返回第1行到第2行的所有行,前闭后开,包括前不包括后
  6.  
  7. #--------跟data.table一样,可以不加逗号选中-----------
  8. data[1:2] #返回第2行,从0计,返回的是单行,通过有前后值的索引形式,
  9. #如果采用data[1]则报错
  10.  
  11. data.ix[1,:] #返回第2行的第三种方法,返回的是DataFrame,跟data[1:2]同
  12.  
  13. data.irow(0) #取data的第一行
  14.  
  15. data.iloc[-1] #选取DataFrame最后一行,返回的是Series
  16. data.iloc[-1:] #选取DataFrame最后一行,返回的是DataFrame

其中跟R中的data.table有点像的是,可以通过data[1],就是选中了第一行。

1、切片-定位

python的切片要是容易跟R进行混淆,那么现在觉得区别就是一般来说要多加一个冒号:

  1. R中:
  2. data[1,]
  3. python中:
  4. data[1,:]

一开始不知道切片是什么,其实就是截取数据块。其中还有如何截取符合条件的数据列。

  1. s[1:2] #x[2,2]
  2. df.ix[2,2] #df[3,3]
  3. df.ix[2:3,2:3]
  4. df.ix[2,"pop"] #可以用列名直接定位
  5. df["pop"]
  6. df[:2] #横向第0行,第1行
  7. df[df["pop"]>3] #df[df$pop>3]

跟R很大的区别,就是python中是从0开始算起。

同时定位的时候需要加入data.ix这个.ix很容易被忽略。

其中注意:

负向切片是需要仔细了解的:

  1. L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
  2. >>> L[-2:]
  3. ['Bob', 'Jack']
  4. >>> L[-2:-1]
  5. ['Bob']

2、删除

  1. s.drop(1) #去掉index为1的行
  2. df.drop(names,axis=0) #axis=0代表行,=1代表列;names代表列名(colnames)或者行名(rownames)

drop(colnames/rownames,axis=0/1)代表按行、按列删除。

3、增加

  1. df.ix[5,:]=[3,"Nevada",3000]
  2. 选中之后,填入数据,当然数值很多情况下,应该用合并的操作了。

————————————————————————————————————-

四、排序与排名

1、排序

  1. foo.order(ascending=False) #按值,降序,ascending=True代表升序
  2. 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 参数)。

  1. df.sort(axis=0,ascending=False,by=None)
  2. #按index,比series 多了axis,横向纵向的功能
  3. #by默认为None,by 参数的作用是针对某一(些)列进行排序(不能对行使用 by 参数)
  4. #by两个,df.sort_index(by=['California','Texas'])

dataframe的排序

2、排名rank

  1. Series.rank(method='average', ascending=True)
  2. #返回的是名次的值value
  3. #处理平级项,方法里的 method 参数就是起这个作用的,他有四个值可选:average, min, max, first
  4.  
  5. dataframe.rank(axis=0, method='first', ascending=True) #按行给出名次

排名(,ascending=False)

  • #数据求秩
  • data.ix[:,1][a.ix[:,1]-1]