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

原文地址:https://www.cnblogs.com/crespohust/p/5987589.html