一句Python,一句R︱pandas模块——高级版data.frame

时间:2021-02-04 17:30:46

先学了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

一句Python,一句R︱pandas模块——高级版data.frame

本图来源于: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)

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