zoukankan      html  css  js  c++  java
  • python数据分析进阶之pandas

    摘要

    Pandas是基于numpy来构建的,让numpy为中心的应用变得更加简单。Pandas主要包括两个数据结构,Series和DataFrame。既能处理时间序列的数据也能处理非时间序列的数据,同时在处理缺省值上面非常灵活。

    一.主要数据结构

    Series

    可以把series理解为一维数组或者向量,由value以及index组成。

    1.创建series

    >>> import pandas as pd

    >>> obj=pd.Series([10,9,8,7,6])

    >>> obj

    0    10

    1     9

    2     8

    3     7

    4     6

    第一列的0-4就是默认的index,第二列就是value。可以手动指定index,如:

    >>> obj2=pd.Series([10,9,8,7],index=['one','two','three',4])

    >>> obj2

    one      10

    two       9

    three     8

    4         7

    dtype: int64

     

    实际上Series也能理解是python的一个字典,当然也能通过传入一个字典来创建一个Series,字典的key就对应索引,字典的value就是series的value,如:

    >>> dic_data={'owen':18,'crespo':28,'ronaldo':20,'cambiasso':46}

    >>> obj3=pd.Series(dic_data)

    >>> obj3

    cambiasso    46

    crespo       28

    owen         18

    ronaldo      20

    dtype: int64

    也可以指定index,字典中的key不在指定的index中的话,就填充NaN,如:

    >>> name=['owen','ronaldo','cambiasso','veron']

    >>> obj4=pd.Series(dic_data,name)

    >>> obj4

    owen         18.0

    ronaldo      20.0

    cambiasso    46.0

    veron         NaN

    dtype: float64

    2,Series的访问

    可以通过下标或者索引来直接访问,如:

    >>> obj2[2]

    8

    >>> obj2['one']

    10

    >>> obj2[['two',4]]

    two    9

    4      7

    dtype: int64

    DataFrame

    DataFrame是表格型数据,有行以及列,类似numpy中的矩阵mt,可以被看做是由Series组成的字典,与R语言中的dataframe类似。

    1.创建DataFrame

    由字典或者numpy创建,key就是默认的列名,而行默认从0开始排序下去,如:

    >>> data={'year':[2001,2002,2003,2001,2005],'country':['china','china','usa','england','German'],'population':[200,300,400,100,50]}

    >>> df=pd.DataFrame(data)

    >>> df

       country  population  year

    0    china         200  2001

    1    china         300  2002

    2      usa         400  2003

    3  england         100  2001

    4   German          50  2005

     

    也可以指定列名以及index,如果字典中不存在,就填充NaN,与创建series类似。

    2.访问DataFrame

    可以按照字典或者属性的方式来访问列,如:

    >>> df['country']

    0      china

    1      china

    2        usa

    3    england

    4     German

    Name: country, dtype: object

    >>> df.year

    0    2001

    1    2002

    2    2003

    3    2001

    4    2005

    Name: year, dtype: int64

    可以使用ix方法来访问某一行,如:

    >>> df.ix[0]

    country       china

    population      200

    year           2001

    Name: 0, dtype: object

    使用如下的ix+列属性或者列索引的方式来访问行列切片,如:

    >>> df.ix[['a','d'],[1,2]]

       usa  england

    a    1        2

    d    7        8

    二.功能操作

    1.重新索引

    比如时间序列需要严格的一些排序,那么就有必要进行重新索引。Reindex会根据新索引进行重新排序,没有的索引会使用NaN来提点,如:

    >>> obj=Series([4,5,6,7],index=['d','b','a','c'])

    >>> obj

    d    4

    b    5

    a    6

    c    7

    dtype: int64

    >>> obj2=obj.reindex(['a','b','c','d','e'])

    >>> obj2

    a    6.0

    b    5.0

    c    7.0

    d    4.0

    e    NaN

    dtype: float64

    利用reindex,对于不存在对应index的缺省值,也可以使用很多方法来填充,如:

    >>> obj3=Series(['blue','yewllo','red'],index=[0,2,4])

    >>> obj3

    0      blue

    2    yewllo

    4       red

    dtype: object

    >>> obj3.reindex(range(6))

    0      blue

    1       NaN

    2    yewllo

    3       NaN

    4       red

    5       NaN

    dtype: object

    >>> obj3.reindex(range(6),method='ffill')

    0      blue

    1      blue

    2    yewllo

    3    yewllo

    4       red

    5       red

    dtype: object

    红色就代表使用ffill(或者pad)进行前向填充,同理还有bfill或者backfll后向填充。

    同理,DataFrame也能使用reindex来进行重新索引,默认是操作行索引,使用columns来操作列索引,如:

    >>> df=DataFrame(np.arange(9).reshape(3,3),index=['a','c','d'],columns=['china','usa','england'])

    >>> df

       china  usa  england

    a      0    1        2

    c      3    4        5

    d      6    7        8

    >>> df2=df.reindex(['a','b','c','d'])

    >>> df2

       china  usa  england

    a    0.0  1.0      2.0

    b    NaN  NaN      NaN

    c    3.0  4.0      5.0

    d    6.0  7.0      8.0

    >>> df3=df.reindex(columns=['usa','china','england','german'])

    >>> df3

       usa  china  england  german

    a    1      0        2     NaN

    c    4      3        5     NaN

    d    7      6        8     NaN

    当然也能同时操作行以及列,如:

    >>> df3=df.reindex(index=['a','b','c','d'],columns=['usa','china','england','german'],method="backfill")

    >>> df3

       usa  china  england  german

    a    1      0        2     NaN

    b    4      3        5     NaN

    c    4      3        5     NaN

    d    7      6        8     NaN

    2.抛弃轴项

    使用drop方法可以抛弃某行或者某列项,默认删除行,如:

    >>> df3.drop('a')

       usa  china  england  german

    b    4      3        5     NaN

    c    4      3        5     NaN

    d    7      6        8     NaN

    使用axis=1来操作列,如:

    >>> df3.drop(['china','german'],axis=1)

       usa  england

    a    1        2

    b    4        5

    c    4        5

    d    7        8

    3.算术以及对齐

    可以对不同索引之间的数据进行运算,如果存在不同的索引时,结果就是并集,同时默认使用NaN来填充,如:

    >>> s1=Series([1,3,5,7,9],index=['a','b','c','d','e'])

    >>> s2=Series([2,4,6,8,10],index=['a','b','g','d','h'])

    >>> s1+s2

    a     3.0

    b     7.0

    c     NaN

    d    15.0

    e     NaN

    g     NaN

    h     NaN

    dtype: float64

    4.汇总和计算描述统计

    DataFrame默认是针对列来进行汇总计算,如:

    >>> df

       china  usa  england

    a      0    1        2

    c      3    4        5

    d      6    7        8

    >>> df.sum()

    china       9

    usa        12

    england    15

    dtype: int64

    >>> df.mean()

    china      3.0

    usa        4.0

    england    5.0

    dtype: float64

    >>> df.max()

    china      6

    usa        7

    england    8

    dtype: int32

    可以使用axis=1参数来操作行,如:

    >>> df.sum(axis=1)

    a     3

    c    12

    d    21

    dtype: int64

    除了以上举例的sum总和,mean均值,max最大值之外,还包括如下几种主流的汇总函数:

    Count(排除NA之外的数量),describe(汇总描述,包括sum,mean,max,min等等),quantile(分位数),median(中位数),var(方差),std(标准差),skew(偏度),kurt(峰度)。

    三.缺失值处理

    Pandas使用NaN(not a number)来表示缺失值,只是一种标记。使用numpy的nan来生成,如:

    >>> np.nan

    nan

    使用isnull来判断是否是缺失值,返回True或者False,如:

    >>> df

       china  usa  england

    a      0    1        2

    c      3    4        5

    d      6    7        8

    >>> df.isnull()

       china    usa england

    a  False  False   False

    c  False  False   False

    d  False  False   False

    Series使用dropna来抛弃掉缺失值,如:

    >>> s2=s1.reindex(['a','e','f','b','d','c'])

    >>> s2

    a    1.0

    e    9.0

    f    NaN(被drop掉)

    b    3.0

    d    7.0

    c    5.0

    dtype: float64

    >>> s2.dropna()

    a    1.0

    e    9.0

    b    3.0

    d    7.0

    c    5.0

    dtype: float64

    DataFrame使用how=‘all’参数来删除行全部为NaN的行,如:

    >>> df2

       china  england  german  england

    a    0.0      2.0     NaN      2.0

    b    NaN      NaN     NaN      NaN(被drop掉)

    c    3.0      5.0     NaN      5.0

    d    6.0      8.0     NaN      8.0

    >>> df2.dropna(how='all')

       china  england  german  england

    a    0.0      2.0     NaN      2.0

    c    3.0      5.0     NaN      5.0

    d    6.0      8.0     NaN      8.0

    使用axis=1来控制列,如:

    >>> df2.dropna(how='all',axis=1)

       china  england  england

    a    0.0      2.0      2.0

    b    NaN      NaN      NaN

    c    3.0      5.0      5.0

    d    6.0      8.0      8.0

    如果不想丢弃掉缺失值,可以使用fillna()函数来填充。如:

    >>> df3.fillna(1)

       china  garman  usa  england  british  iceland  swiss  italy  france

    a    0.0     1.0  1.0      2.0      1.0      1.0    1.0    1.0     1.0

    b    1.0     1.0  1.0      1.0      1.0      1.0    1.0    1.0     1.0

    c    3.0     1.0  4.0      5.0      1.0      1.0    1.0    1.0     1.0

    d    6.0     1.0  7.0      8.0      1.0      1.0    1.0    1.0     1.0

    e    1.0     1.0  1.0      1.0      1.0      1.0    1.0    1.0     1.0

    f    1.0     1.0  1.0      1.0      1.0      1.0    1.0    1.0     1.0

    g    1.0     1.0  1.0      1.0      1.0      1.0    1.0    1.0     1.0

    也可以使用method来控制填充内容,如:

    >>> df3.fillna(method='ffill')

       china  garman  usa  england  british  iceland  swiss  italy  france

    a    0.0     NaN  1.0      2.0      NaN      NaN    NaN    NaN     NaN

    b    0.0     NaN  1.0      2.0      NaN      NaN    NaN    NaN     NaN

    c    3.0     NaN  4.0      5.0      NaN      NaN    NaN    NaN     NaN

    d    6.0     NaN  7.0      8.0      NaN      NaN    NaN    NaN     NaN

    e    6.0     NaN  7.0      8.0      NaN      NaN    NaN    NaN     NaN

    f    6.0     NaN  7.0      8.0      NaN      NaN    NaN    NaN     NaN

    g    6.0     NaN  7.0      8.0      NaN      NaN    NaN    NaN     NaN

    使用其他值来填充,如平均值:

    >>> df3.fillna(df['usa'].mean())

       china  garman  usa  england  british  iceland  swiss  italy  france

    a    0.0     4.0  1.0      2.0      4.0      4.0    4.0    4.0     4.0

    b    4.0     4.0  4.0      4.0      4.0      4.0    4.0    4.0     4.0

    c    3.0     4.0  4.0      5.0      4.0      4.0    4.0    4.0     4.0

    d    6.0     4.0  7.0      8.0      4.0      4.0    4.0    4.0     4.0

    e    4.0     4.0  4.0      4.0      4.0      4.0    4.0    4.0     4.0

    f    4.0     4.0  4.0      4.0      4.0      4.0    4.0    4.0     4.0

    g    4.0     4.0  4.0      4.0      4.0      4.0    4.0    4.0     4.0

  • 相关阅读:
    关于MySQL Server影响ASP.NET网站使用的问题:未能加载文件或程序集MySql.Web.v20
    关于DataGridViewComboBoxColumn的二三事
    我是如何准备高项的
    MyBatis接口式编程
    初识MyBatis之HelloWorld
    Java基础——值传递
    Java基础——接口和抽象类
    Java基础一
    POST和GET的区别
    Python浅拷贝和深拷贝
  • 原文地址:https://www.cnblogs.com/crespohust/p/5987589.html
Copyright © 2011-2022 走看看