Python数据分析-07

1.DataFrame对象

按照一定顺序排列多列数据,各列数据类型可以有所不同

DataFrame对象有两个索引数组,第一个数组与行相关,它与Series的索引数组极为相似,每个标签与标签所在行的所有元素相关联,第二个数组包含一系列标签,每个标签与一列数据相关联

DataFrame可以理解为一个由Series组成的字典,其中每一列的名称为字典的键,形成DataFrame的列的Series作为字典的值

2定义DateFrame对象

新建dataFrame最常用的方法是传递一个dict对象给DataFrame()构造函数

dictd对象的每一列名称作为键,每个键都有一个数组作为值

1)将字典的每个键值对都放入DataFrame中

>>> import pandas as pd  #引入pandas包

>>> dict={'colors':['red','blue','yellow','black'],'object':['pen','paper','ball','mug'],'price':[1.1,1.2,3.2,4]}  #定义一个字典,每个键是以后DataFrame对象的列名,每个键对应的值是以后DataFrame列的元素内容

>>> dict

{'object': ['pen', 'paper', 'ball', 'mug'], 'price': [1.1, 1.2, 3.2, 4], 'colors': ['red', 'blue', 'yellow', 'black']}

>>> s=pd.DataFrame(dict) #利用DataFrame的构造函数,将dict的内容放入DataFrame中

>>> s 

  colors object price

0   red  pen  1.1

1  blue paper  1.2

2 yellow  ball  3.2

3  black  mug  4.0

2)挑选字典中部分数据对用来初始化DataFrame对象

>>> import pandas as pd #导入pandas包

>>> dic={'colos':['red','black','yellow','orange'],'object':['pen','ball','shirt','mug'],'price':[1.2,3.4,2.3,5]} #定义字典

>>> dic

{'object': ['pen', 'ball', 'shirt', 'mug'], 'price': [1.2, 3.4, 2.3, 5], 'colos': ['red', 'black', 'yellow', 'orange']}

>>> s=pd.DataFrame(dic,columns=['price','object']) #用字典来初始化DataFrame对象并且只选择两列数据,且顺序按照我选择的来ding

>>> s

  price object

0  1.2  pen

1  3.4  ball

2  2.3 shirt

3  5.0  mug

3)对DataFrame对象进行自定义索引(上面的例子都是不定义,系统默认从0开始定义)

4)不使用字典,使用构造函数三个参数来进行定义DataFrame

指定三个参数,顺序:数据矩阵、index选项、columns选项、将存放标签的数组赋给index,将存放列名的数组赋值给columns选项、可使用np.arange(16).reshape(4,4)快捷生成矩阵

>>> import numpy as np

>>> import pandas as pd

>>> arry=np.arange(16)

>>> arry

array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])

>>> arry=np.arange(16).reshape(4,4)

>>> arry

array([[ 0, 1, 2, 3],

    [ 4, 5, 6, 7],

    [ 8, 9, 10, 11],

    [12, 13, 14, 15]])

>>> s=pd.DataFrame(arry,index=['a','b','c','d'],columns=['A','B','C','D'])

>>> s

  A  B  C  D

a  0  1  2  3

b  4  5  6  7

c  8  9 10 11

d 12 13 14 15

3.选取元素

1)要想知道DataFrame的所有列的名称,对它调用columns属性即可

2)要想获取DataFrame的索引列表,调用index熟悉即可

3)想要获取数据结构中的元素,使用values熟悉获取即可

>>> import numpy as np

>>> import pandas as pd

>>> arry=np.arange(16)

>>> arry

array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])

>>> arry=np.arange(16).reshape(4,4)

>>> arry

array([[ 0, 1, 2, 3],

    [ 4, 5, 6, 7],

    [ 8, 9, 10, 11],

    [12, 13, 14, 15]])

>>> s=pd.DataFrame(arry,columns=['a','b','c','d'])

>>> s

  a  b  c  d

0  0  1  2  3

1  4  5  6  7

2  8  9 10 11

3 12 13 14 15

>>> s=pd.DataFrame(arry,index=['a','b','c','d'],columns=['A','B','C','D'])

>>> s

  A  B  C  D

a  0  1  2  3

b  4  5  6  7

c  8  9 10 11

d 12 13 14 15

>>> s.index

Index(['a', 'b', 'c', 'd'], dtype='object')

>>> s.columns

Index(['A', 'B', 'C', 'D'], dtype='object')

>>> s.values

array([[ 0, 1, 2, 3],

    [ 4, 5, 6, 7],

    [ 8, 9, 10, 11],

    [12, 13, 14, 15]])

4)如果想要获取一列元素内容,把这一列名称作为所以即可,或者是调用这个列名的属性方法

第一种方法

>>> s['B']

a   1

b   5

c   9

d  13

Name: B, dtype: int64

第二种方法

>>> s.B

a   1

b   5

c   9

d  13

Name: B, dtype: int64

5)获取DataFrame某一行数据,利用ix熟悉的索引值获取

获取单行

>>> s

  A  B  C  D

a  0  1  2  3

b  4  5  6  7

c  8  9 10 11

d 12 13 14 15

>>> s.ix[2]

A   8

B   9

C  10

D  11

Name: c, dtype: int64

>>> s.ix['c']

A   8

B   9

C  10

D  11

Name: c, dtype: int64

获取多行(非连续)

>>> s

  A  B  C  D

a  0  1  2  3

b  4  5  6  7

c  8  9 10 11

d 12 13 14 15

>>> s.ix[[1,3]]

  A  B  C  D

b  4  5  6  7

d 12 13 14 15

>>> s.ix[['b','d']]

  A  B  C  D

b  4  5  6  7

d 12 13 14 15

获取多行(连续)

>>> s

  A  B  C  D

a  0  1  2  3

b  4  5  6  7

c  8  9 10 11

d 12 13 14 15

>>> s.ix[0:3]

  A B  C  D

a 0 1  2  3

b 4 5  6  7

c 8 9 10 11

>>> s.ix['a':'c']

  A B  C  D

a 0 1  2  3

b 4 5  6  7

c 8 9 10 11

获取某个元素

>>> s

  A  B  C  D

a  0  1  2  3

b  4  5  6  7

c  8  9 10 11

d 12 13 14 15

>>> s['A'][1] #注意一定要先写列【A】在写行【1】

4

4.赋值

1)给index和columns指定name

>>> import numpy as np

>>> import pandas as pd

>>> arry=np.arange(16)

>>> arry

array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])

>>> arry=np.arange(16).reshape(4,4)

>>> arry

array([[ 0, 1, 2, 3],

    [ 4, 5, 6, 7],

    [ 8, 9, 10, 11],

    [12, 13, 14, 15]])

>>> s=pd.DataFrame(arry,index=['a','b','c','d'],columns=['A','B','C','D'])

>>> s

  A  B  C  D

a  0  1  2  3

b  4  5  6  7

c  8  9 10 11

d 12 13 14 15

>>> s.index.name=id

>>> s.columns.name='item'

>>> s

item           A  B  C  D

a            0  1  2  3

b            4  5  6  7

c            8  9 10 11

d            12 13 14 15

>>> s.index.name='id'

>>> s

item  A  B  C  D

id

a   0  1  2  3

b   4  5  6  7

c   8  9 10 11

d   12 13 14 15

2)添加一列新元素

>>> s

item  A  B  C  D

id

a   0  1  2  3

b   4  5  6  7

c   8  9 10 11

d   12 13 14 15

>>> s['E']=12

>>> s

item  A  B  C  D  E

id

a   0  1  2  3 12

b   4  5  6  7 12

c   8  9 10 11 12

d   12 13 14 15 12

3)给已经有的一列更新元素值

>>> s

item  A  B  C  D  E

id

a   0  1  2  3 12

b   4  5  6  7 12

c   8  9 10 11 12

d   12 13 14 15 12

>>> s['E']=[3,5,2,6]

>>> s

item  A  B  C  D E

id

a   0  1  2  3 3

b   4  5  6  7 5

c   8  9 10 11 2

d   12 13 14 15 6

5.元素的所属关系

>>> s

item  A  B  C  D  E  F

id

a   0  1  2  3 NaN NaN

b   4  5  6  7 NaN NaN

c   8  9 10 11 NaN NaN

d   12 13 14 15 NaN NaN

>>> s.isin([1,4])

item   A   B   C   D   E   F

id

a   False  True False False False False

b   True False False False False False

c   False False False False False False

d   False False False False False False

>>> s[s.isin([1,4])]

item  A  B  C  D  E  F

id

a   NaN 1.0 NaN NaN NaN NaN

b   4.0 NaN NaN NaN NaN NaN

c   NaN NaN NaN NaN NaN NaN

d   NaN NaN NaN NaN NaN NaN

6.删除一列

>>> s

item  A  B  C  D  E  F

id

a   0  1  2  3 NaN NaN

b   4  5  6  7 NaN NaN

c   8  9 10 11 NaN NaN

d   12 13 14 15 NaN NaN

>>> del s['E']

>>> s

item  A  B  C  D  F

id

a   0  1  2  3 NaN

b   4  5  6  7 NaN

c   8  9 10 11 NaN

d   12 13 14 15 NaN

7.筛选

>>> s

item  A  B  C  D  F

id

a   0  1  2  3 NaN

b   4  5  6  7 NaN

c   8  9 10 11 NaN

d   12 13 14 15 NaN

>>> s[s<3]

item  A  B  C  D  F

id

a   0.0 1.0 2.0 NaN NaN

b   NaN NaN NaN NaN NaN

c   NaN NaN NaN NaN NaN

d   NaN NaN NaN NaN NaN

8.用嵌套字典生成DataFrame对象

将嵌套字典作为参数传递给DataFrame的构造函数,pandas就会将内部的键作为列名,将外部的键作为索引名,并非所有位置都有相应的元素存在,pandas会用NaN填充

>>> import pandas as pd

>>> dic={'red':{2012:22,2013:33},'white':{2011:13,2012:22,2013:16},'blue':{2017:17,2012:23,2018:18}}

>>> dic

{'blue': {2017: 17, 2018: 18, 2012: 23}, 'white': {2011: 13, 2012: 22, 2013: 16}, 'red': {2012: 22, 2013: 33}}

>>> s=pd.DataFrame(dic)

>>> s

   blue  red white

2011  NaN  NaN  13.0

2012 23.0 22.0  22.0

2013  NaN 33.0  16.0

2017 17.0  NaN  NaN

2018 18.0  NaN  NaN

9.DataFrame转置

>>> s

   blue  red white

2011  NaN  NaN  13.0

2012 23.0 22.0  22.0

2013  NaN 33.0  16.0

2017 17.0  NaN  NaN

2018 18.0  NaN  NaN

>>> s.T #调用T方法就行

    2011 2012 2013 2017 2018

blue  NaN 23.0  NaN 17.0 18.0

red   NaN 22.0 33.0  NaN  NaN

white 13.0 22.0 16.0  NaN  NaN

10.index对象

在Series和DataFrame中index声明后不可改变

11.index对象的方法

idmin()和idmax()函数分别返回索引值最小和最大的元素

12.含有重复标签的index

>>> import pandas as pd

>>> s=pd.Series(range(6),index=['a','a','b','c','c','d'])

>>> s

a  0

a  1

b  2

c  3

c  4

d  5

dtype: int64

>>> s['a']

a  0

a  1

dtype: int64

>>> s.index.is_unique #用来判断索引中是否有重复的索引

False

13.更换索引

pandas的reindex函数可更换Series对象的索引,根据新标签序列,重新调整原来Series的元素,生成一个新的Series对象

更换索引时,可以调整所以序列中各标签的顺序,删除或增加新标签

>>> import pandas as pd

>>> s=pd.Series([1,2,3,4],index=['a','b','c','d'])

>>> s

a  1

b  2

c  3

d  4

dtype: int64

>>> s.reindex(['e','f','g','b'])

e  NaN

f  NaN

g  NaN

b  2.0

dtype: float64

然而通过上述reindex的方式重新定义索引对于庞大的DataFrame不太适应,可以采用自动填充或插值的方法

如下:

>>> import pandas as pd

>>> s=pd.Series([1,5,6,3],index=[0,3,5,6])

>>> s

0  1

3  5

5  6

6  3

dtype: int64

>>> s.reindex(range(6),method='ffill')#让对s这个对象的索引从0-5开始重新定义索引,ffill告诉系统新增索引对应值取比他小的那个索引对应的值

0  1

1  1

2  1

3  5

4  5

5  6

dtype: int64

>>>

>>> s=pd.Series([1,5,6,3],index=[0,3,5,6])

>>> s

0  1

3  5

5  6

6  3

dtype: int64

>>> s.reindex(range(6),method='bfill')#bfill告诉系统新增索引的值用它后一个索引的元素值填充

0  1

1  5

2  5

3  5

4  6

5  6

dtype: int64

>>> dic={'colors':['blue','green','yellow','red','white'],'price':[1.2,1.0,0.6,0.9,1.7],'object':['ballpand','pen','pencil','paper','mug']}#定义一个嵌套字典

>>> dic

{'object': ['ballpand', 'pen', 'pencil', 'paper', 'mug'], 'price': [1.2, 1.0, 0.6, 0.9, 1.7], 'colors': ['blue', 'green', 'yellow', 'red', 'white']}

>>> s=pd.DataFrame(dic)#用嵌套字典定义s这个对象

>>> s

  colors  object price

0  blue ballpand  1.2

1  green    pen  1.0

2 yellow  pencil  0.6

3   red   paper  0.9

4  white    mug  1.7

>>> s.reindex(range(5),method='ffill',columns=['colors','price','new','object'])#补充new这个列索引

  colors price   new  object

0  blue  1.2  blue ballpand

1  green  1.0  green    pen

2 yellow  0.6 yellow  pencil

3   red  0.9   red   paper

4  white  1.7  white    mug

>>> s=pd.DataFrame(dic,index=[1,2,3,5,7] )#自定义一个索引的DataFrame对象

>>> s

  colors  object price

1  blue ballpand  1.2

2  green    pen  1.0

3 yellow  pencil  0.6

5   red   paper  0.9

7  white    mug  1.7

>>> s.reindex(range(5),method='ffill')#重定义行索引

  colors  object price

0   NaN    NaN  NaN

1  blue ballpand  1.2

2  green    pen  1.0

3 yellow  pencil  0.6

4 yellow  pencil  0.6

14.删除索引

1)删除Series中一项

2)删除Series中多项,需要将多项组合成数组放入drop函数中

3)删除DataFrame中某几行

4)删除DataFrame中列:需要加入axis值=1代表列

>>> import numpy as np

>>> import pandas as pd

>>> s=pd.Series(np.arange(4),index=['red','blue','yellow','white'])

>>> s

red    0

blue   1

yellow  2

white   3

dtype: int64

>>> s.drop('yellow')#删除Series中某个索引极其对应元素

red   0

blue   1

white  3

dtype: int64

>>> s.drop(['red','white'])#删除Series中多个索引

blue   1

yellow  2

dtype: int64

>>> frame=pd.DataFrame(np.arange(16).reshape(4,4),index=['red','blue','yellow','white'],columns=['ball','pen','pencil','paper'])

>>> frame

    ball pen pencil paper

red    0  1    2   3

blue    4  5    6   7

yellow   8  9   10   11

white   12  13   14   15

>>> frame.drop(['blue','yellow'])#删除DataFrame中多个行

    ball pen pencil paper

red    0  1    2   3

white  12  13   14   15

>>> frame.drop(['pen','pencil'],axis=1)#删除DataFrame中多个列,需要指定axis=1

    ball paper

red    0   3

blue    4   7

yellow   8   11

white   12   15

15.算术和数据对齐

1)两个Series对象相加

>>> import pandas as pd

>>> s1=pd.Series([3,2,5,1],['white','yellow','green','blue'])

>>> s2=pd.Series([1,4,7,2,1],index=['white','yellow','black','blue','brown'])

>>> s1

white   3

yellow  2

green   5

blue   1

dtype: int64

>>> s2

white   1

yellow  4

black   7

blue   2

brown   1

dtype: int64

>>> s1+s2

black   NaN

blue   3.0

brown   NaN

green   NaN

white   4.0

yellow  6.0

dtype: float64

2)两个DataFrame对象相加

>>> import numpy as np

>>> frame1=pd.DataFrame(np.arange(16).reshape(4,4),index=['red','blue','yellow','white'],columns=['ball','pen','pencil','paper'])

>>> frame2=pd.DataFrame(np.arange(12).reshape(4,3),index=['blue','green','white','yellow'],columns=['mug','pen','ball'])

>>> frame1

    ball pen pencil paper

red    0  1    2   3

blue    4  5    6   7

yellow   8  9   10   11

white   12  13   14   15

>>> frame2

    mug pen ball

blue   0  1   2

green   3  4   5

white   6  7   8

yellow  9  10  11

>>> frame1+frame2

    ball mug paper  pen pencil

blue   6.0 NaN  NaN  6.0   NaN

green  NaN NaN  NaN  NaN   NaN

red   NaN NaN  NaN  NaN   NaN

white  20.0 NaN  NaN 20.0   NaN

yellow 19.0 NaN  NaN 19.0   NaN

上述也可以使用如下的函数方法:

1)Series之间相加

2)DataFrame之间相加

>>> s1.add(s2)

black   NaN

blue   3.0

brown   NaN

green   NaN

white   4.0

yellow  6.0

dtype: float64

>>> frame1.add(frame2)

    ball mug paper  pen pencil

blue   6.0 NaN  NaN  6.0   NaN

green  NaN NaN  NaN  NaN   NaN

red   NaN NaN  NaN  NaN   NaN

white  20.0 NaN  NaN 20.0   NaN

yellow 19.0 NaN  NaN 19.0   NaN

16.DataFramehe Series之间的运算

1)Series的索引=DataFrame的列名

>>> import numpy as np

>>> import pandas as pd

>>> s=pd.Series([1,2,3,4],index=['a','b','c','d'])

>>> frame=pd.DataFrame(np.arange(16).reshape(4,4),columns=['a','b','c','d'])

>>> s

a  1

b  2

c  3

d  4

dtype: int64

>>> frame

  a  b  c  d

0  0  1  2  3

1  4  5  6  7

2  8  9 10 11

3 12 13 14 15

>>> s+frame #frame的每一列都加上s的对应索引的对应值

  a  b  c  d

0  1  3  5  7

1  5  7  9 11

2  9 11 13 15

3 13 15 17 19

>>> frame-s #frame的每一列都加上s的对应索引的对应值

  a  b  c  d

0 -1 -1 -1 -1

1  3  3  3  3

2  7  7  7  7

3 11 11 11 11

2)Series的索引!=DataFrame的列名

>>> frame2=pd.DataFrame(np.arange(16).reshape(4,4),columns=['b','d','e','c'])

>>> s

a  1

b  2

c  3

d  4

dtype: int64

>>> frame2

  b  d  e  c

0  0  1  2  3

1  4  5  6  7

2  8  9 10 11

3 12 13 14 15

>>> s+frame2

  a   b   c   d  e

0 NaN  2.0  6.0  5.0 NaN

1 NaN  6.0 10.0  9.0 NaN

2 NaN 10.0 14.0 13.0 NaN

3 NaN 14.0 18.0 17.0 NaN

>>> frame2-s

  a   b   c  d  e

0 NaN -2.0  0.0 -3.0 NaN

1 NaN  2.0  4.0 1.0 NaN

2 NaN  6.0  8.0 5.0 NaN

3 NaN 10.0 12.0 9.0 NaN

17.对DataFrame的每个元素求平方根,利用numpy的sqrt函数

>>> frame

  a  b  c  d

0  0  1  2  3

1  4  5  6  7

2  8  9 10 11

3 12 13 14 15

>>> np.sqrt(frame)

     a     b     c     d

0 0.000000 1.000000 1.414214 1.732051

1 2.000000 2.236068 2.449490 2.645751

2 2.828427 3.000000 3.162278 3.316625

3 3.464102 3.605551 3.741657 3.872983

18.按行或列执行操作的函数

1)按列对DataFrame每一列进行套用自定义函数

2)按行对DataFrame每一行进行套用自定义函数

>>> f=lambda x:x.max()-x.min()

>>> frame.apply(f) #函数参数是DataFrame中的每一列

a  12

b  12

c  12

d  12

dtype: int64

>>> frame.apply(f,axis=1)#axis=1代表f参数是DataFrame的每一行

0  3

1  3

2  3

3  3

dtype: int64

3)利用apply套用函数对某个DataFrame处理成另一个Dataframe,从而实现多维度计算

>>> f=lambda x:pd.Series([x.min(),x.max()],index=['min','max'])定义一个函数,函数的参数x是某DataFrame的一列,f然会一个Series对象,索引是min和max值是DaraFrame列的最大值和最小值

>>> frame.apply(f)#对frame这个Dataframe套用f函数,对每一列计算后都会有一个Series对象,所有的列的Series对象组合成为一个DataFrame对象产出

   a  b  c  d

min  0  1  2  3

max 12 13 14 15

19.统计函数

数组的大多数统计函数对DataFrame依旧有效

>>> frame

  a  b  c  d

0  0  1  2  3

1  4  5  6  7

2  8  9 10 11

3 12 13 14 15

>>> frame.sum()

a  24

b  28

c  32

d  36

dtype: int64

>>> frame.mean()

a  6.0

b  7.0

c  8.0

d  9.0

dtype: float64

>>> frame.describe()

        a     b     c     d

count  4.000000  4.000000  4.000000  4.000000

mean  6.000000  7.000000  8.000000  9.000000

std   5.163978  5.163978  5.163978  5.163978

min   0.000000  1.000000  2.000000  3.000000

25%   3.000000  4.000000  5.000000  6.000000

50%   6.000000  7.000000  8.000000  9.000000

75%   9.000000 10.000000 11.000000 12.000000

max  12.000000 13.000000 14.000000 15.000000

>>> frame.sum(axis=1)#要想对行进行套用统计函数,需要指定axis=1

0   6

1  22

2  38

3  54

dtype: int64

20.排序和排位次

1)Series对象的排序

>>> import numpy as np

>>> import pandas as pd

>>> s=pd.Series([5,0,3,8,4],index=['red','blue','yellow','white','green'])

>>> s

red    5

blue   0

yellow  3

white   8

green   4

dtype: int64

>>> s.sort_index()#按照索引的A-z排序

blue   0

green   4

red    5

white   8

yellow  3

dtype: int64

>>> s.sort_index(ascending=False)#ascending参数代表指定是否是降序

yellow  3

white   8

red    5

green   4

blue   0

dtype: int64

2)DataFrame对象的排序

>>> import numpy as np

>>> import pandas as pd

>>> frame=pd.DataFrame(np.arange(16).reshape(4,4),index=['red','blue','yellow','white'],columns=['ball','pen','pencil','paper'])

>>> frame

    ball pen pencil paper

red    0  1    2   3

blue    4  5    6   7

yellow   8  9   10   11

white   12  13   14   15

>>> frame.sort_index()#默认按照行索引进行排序,就是按照blue、red、white、yellow排序

    ball pen pencil paper

blue    4  5    6   7

red    0  1    2   3

white   12  13   14   15

yellow   8  9   10   11

>>> frame.sort_index(axis=1)#axis=1说明按照列索引排序,按照ball、paper、pen、pencil排序是整列整列的换位置

    ball paper pen pencil

red    0   3  1    2

blue    4   7  5    6

yellow   8   11  9   10

white   12   15  13   14

21以上都是对索引进行排序以下对对象中内容进行排序

1)对Series中元素内容进行排序

s.order()

2)对DataFrame中元素内容进行排序

>>> frame

    ball pen pencil paper

red    0  1    2   3

blue    4  5    6   7

yellow   8  9   10   11

white   12  13   14   15

>>> frame.sort_index(by='pen')

__main__:1: FutureWarning: by argument to sort_index is deprecated, please use .sort_values(by=...)

    ball pen pencil paper

red    0  1    2   3

blue    4  5    6   7

yellow   8  9   10   11

white   12  13   14   15

22.相关性和协方差

1)两个Series对象之间的相关性和协方差

>>> import numpy as np

>>> import pandas as pd

>>> s1=pd.Series([3,4,3,4,5,4,3,2])

>>> s2=pd.Series([1,2,3,4,4,3,2,1])

>>> s1

0  3

1  4

2  3

3  4

4  5

5  4

6  3

7  2

dtype: int64

>>> s2

0  1

1  2

2  3

3  4

4  4

5  3

6  2

7  1

dtype: int64

>>> s1.corr(s2) #相关性

0.7745966692414834

>>> s1.cov(s2)#协方差

0.8571428571428571

2)单个DataFrame的相关性和协方差

>>> frame=pd.DataFrame([[1,4,3,6],[4,5,6,1],[3,3,1,5],[4,1,6,4]],index=['red','blue','yellow','white'],columns=['ball','pen','pencil','paper'])

>>> frame

    ball pen pencil paper

red    1  4    3   6

blue    4  5    6   1

yellow   3  3    1   5

white   4  1    6   4

>>> frame.corr()

      ball    pen  pencil   paper

ball  1.000000 -0.276026 0.577350 -0.763763

pen  -0.276026 1.000000 -0.079682 -0.361403

pencil 0.577350 -0.079682 1.000000 -0.692935

paper -0.763763 -0.361403 -0.692935 1.000000

>>> frame.cov()

      ball    pen  pencil   paper

ball  2.000000 -0.666667 2.000000 -2.333333

pen  -0.666667 2.916667 -0.333333 -1.333333

pencil 2.000000 -0.333333 6.000000 -3.666667

paper -2.333333 -1.333333 -3.666667 4.666667

3)DataFrame对象的行或者列与Series对象或其他DataFrame对象元素两两之间的相关性

>>> s

red    5

blue   0

yellow  3

white   8

green   4

dtype: int64

>>> frame

    ball pen pencil paper

red    1  4    3   6

blue    4  5    6   1

yellow   3  3    1   5

white   4  1    6   4

>>> frame.corrwith(s)

ball   -0.140028

pen   -0.869657

pencil  0.080845

paper   0.595854

dtype: float64

23.为元素赋NaN值

>>> s=pd.Series([1,2,np.NaN,3])

>>> s

0  1.0

1  2.0

2  NaN

3  3.0

dtype: float64

24.过滤NaN

>>> s

0  1.0

1  2.0

2  NaN

3  3.0

dtype: float64

>>> s.dropna()#利用dropna函数

0  1.0

1  2.0

3  3.0

dtype: float64

>>>

或者用以下方法:利用notnull方法

>>> s=pd.Series([1,2,np.NaN,3])

>>> s

0  1.0

1  2.0

2  NaN

3  3.0

dtype: float64

>>> s[s.notnull()]

0  1.0

1  2.0

3  3.0

dtype: float64:使用dropna()方法只要行或者列有一个NaN元素,该行或列的全部元素都会被删除

>>> frame=pd.DataFrame([[6,np.NaN,6],[np.NaN,np.NaN,np.NaN],[2,np.NaN,5]],index=['blue','green','red'],columns=['ball','mug','pen'])

>>> frame

    ball mug pen

blue  6.0 NaN 6.0

green  NaN NaN NaN

red   2.0 NaN 5.0

>>> frame.dropna()

Empty DataFrame

Columns: [ball, mug, pen]

Index: []

因此为了防止避免删除整行或整列,需要使用how选项,值位all,告知dropna函数只删除所有元素都是NaN的行或者列

>>> frame=pd.DataFrame([[6,np.NaN,6],[np.NaN,np.NaN,np.NaN],[2,np.NaN,5]],index=['blue','green','red'],columns=['ball','mug','pen'])

>>> frame

    ball mug pen

blue  6.0 NaN 6.0

green  NaN NaN NaN

red   2.0 NaN 5.0

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

   ball mug pen

blue  6.0 NaN 6.0

red  2.0 NaN 5.0

25.为NaN元素填充其他值

1)将所有的NAN替换成同一个元素,利用fillna函数

>>> frame=pd.DataFrame([[6,np.NaN,6],[np.NaN,np.NaN,np.NaN],[2,np.NaN,5]],index=['blue','green','red'],columns=['ball','mug','pen'])

>>> frame

    ball mug pen

blue  6.0 NaN 6.0

green  NaN NaN NaN

red   2.0 NaN 5.0

>>> frame.fillna(0)

    ball mug pen

blue  6.0 0.0 6.0

green  0.0 0.0 0.0

red   2.0 0.0 5.0

2)将不同列的NaN替换成不同的元素:需要依次指定列名及要替换成的元素即可

>>> frame.fillna('ball':1,'mug':2,'pen':8)

26.等级索引和分级

1)创建带有等级索引的Series对象

>>> import numpy as np

>>> import pandas as pd

>>> s=pd.Series(np.random.rand(8),index=[['a','a','a','b','b','c','c','c'],['up','down','right','up','down','up','down','left']])

>>> s

a up    0.587733

  down   0.425383

  right  0.356205

b up    0.251802

  down   0.105830

c up    0.253041

  down   0.140155

  left   0.425004

dtype: float64

2)展示带有等级索引Series对象的index属性

>>> s.index

MultiIndex(levels=[['a', 'b', 'c'], ['down', 'left', 'right', 'up']],

      labels=[[0, 0, 0, 1, 1, 2, 2, 2], [3, 0, 2, 3, 0, 3, 0, 1]])

3)选取带有等级索引的Series对象的第一级索引对应的元素

>>> s['a']

up    0.587733

down   0.425383

right  0.356205

dtype: float64

4)选取带有等级索引的Series对象的第二级索引对应的元素

>>> s[:,'up'] #一定记得有个逗号

a  0.587733

b  0.251802

c  0.253041

dtype: float64

5)选取带有等级索引的Series对象的某个具体的元素

>>> s['a','up']

0.5877327517004284

6)将带有等级索引的Series对象改变成一个DataFrame对象

>>> s.unstack()

    down   left   right    up

a 0.425383    NaN 0.356205 0.587733

b 0.105830    NaN    NaN 0.251802

c 0.140155 0.425004    NaN 0.253041

7)将一个DataFrame对象改变成一个带有等级索引给的Series对象

>>> frame

    down   left   right    up

a 0.425383    NaN 0.356205 0.587733

b 0.105830    NaN    NaN 0.251802

c 0.140155 0.425004    NaN 0.253041

>>> frame.stack()

a down   0.425383

  right  0.356205

  up    0.587733

b down   0.105830

  up    0.251802

c down   0.140155

  left   0.425004

  up    0.253041

dtype: float64

8)定义一个index和columns都是等级的DataFrame对象

>>> frame=pd.DataFrame(np.random.randn(16).reshape(4,4),index=[['white','white','red','red'],['up','down','up','down']],columns=[['pen','pen','paper','paper'],[1,2,1,2]])

>>> frame

         pen        paper

          1     2     1     2

white up  -0.487631 0.200648 0.344613 0.144835

   down 0.246683 -0.847063 -0.391592 -0.091928

red  up  -0.132962 -1.728167 1.787231 0.374895

   down -1.033622 0.354458 0.007813 -1.203889

27.重新调整顺序和为层级排序

>>> frame

         pen        paper

          1     2     1     2

white up  -0.487631 0.200648 0.344613 0.144835

   down 0.246683 -0.847063 -0.391592 -0.091928

red  up  -0.132962 -1.728167 1.787231 0.374895

   down -1.033622 0.354458 0.007813 -1.203889

>>> frame.index.names=['colors','status']

>>> frame.columns.names=['objects','id']

>>> frame

objects       pen        paper

id          1     2     1     2

colors status

white up   -0.487631 0.200648 0.344613 0.144835

    down  0.246683 -0.847063 -0.391592 -0.091928

red  up   -0.132962 -1.728167 1.787231 0.374895

    down  -1.033622 0.354458 0.007813 -1.203889

>>> frame.swaplevel('colors','status')#交换colors和status两列层级顺序

objects       pen        paper

id          1     2     1     2

status colors

up   white -0.487631 0.200648 0.344613 0.144835

down  white  0.246683 -0.847063 -0.391592 -0.091928

up   red  -0.132962 -1.728167 1.787231 0.374895

down  red  -1.033622 0.354458 0.007813 -1.203889

>>> frame

objects       pen        paper

id          1     2     1     2

colors status

white up   -0.487631 0.200648 0.344613 0.144835

    down  0.246683 -0.847063 -0.391592 -0.091928

red  up   -0.132962 -1.728167 1.787231 0.374895

    down  -1.033622 0.354458 0.007813 -1.203889

>>> frame.sortlevel()#使用sortlevel对colots的所有进行首字母的顺序排列

__main__:1: FutureWarning: sortlevel is deprecated, use sort_index(level= ...)

objects       pen        paper

id          1     2     1     2

colors status

red  down  -1.033622 0.354458 0.007813 -1.203889

    up   -0.132962 -1.728167 1.787231 0.374895

white down  0.246683 -0.847063 -0.391592 -0.091928

    up   -0.487631 0.200648 0.344613 0.144835

28.按层级统计数据

1)按照某一行层级统计,将层级名称赋值给level,level作为统计函数的参数

>>> frame

objects       pen        paper

id          1     2     1     2

colors status

white up   -0.487631 0.200648 0.344613 0.144835

    down  0.246683 -0.847063 -0.391592 -0.091928

red  up   -0.132962 -1.728167 1.787231 0.374895

    down  -1.033622 0.354458 0.007813 -1.203889

>>> frame.sum(level='colors')#对colors这个行层级进行sum处理

objects    pen        paper

id       1     2     1     2

colors

white  -0.240947 -0.646416 -0.046978 0.052907

red   -1.166584 -1.373709 1.795044 -0.828994

2)想要对某一列层级

>>> frame

objects       pen        paper

id          1     2     1     2

colors status

white up   -0.487631 0.200648 0.344613 0.144835

    down  0.246683 -0.847063 -0.391592 -0.091928

red  up   -0.132962 -1.728167 1.787231 0.374895

    down  -1.033622 0.354458 0.007813 -1.203889

>>> frame.sum(level='id',axis=1) #对id这个列层级进行sum处理,用axis=1标识对列处理

id          1     2

colors status

white up   -0.143017 0.345483

    down  -0.144909 -0.938991

red  up   1.654270 -1.353272

    down  -1.025809 -0.849432

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容