利用Python进行数据分析_Pandas_基础_2

Posted 木东

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Python进行数据分析_Pandas_基础_2相关的知识,希望对你有一定的参考价值。

申明:本系列文章是自己在学习《利用Python进行数据分析》这本书的过程中,为了方便后期自己巩固知识而整理。

第一 重新索引

Series的reindex方法

In [15]: obj = Series([3,2,5,7,6,9,0,1,4,8],index=[\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',
    ...: \'h\',\'i\',\'j\'])

In [16]: obj1 = obj.reindex([\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'h\',\'i\',\'j\',\'k\'])

In [17]: obj1
Out[17]:
a    3.0
b    2.0
c    5.0
d    7.0
e    6.0
f    9.0
g    0.0
h    1.0
i    4.0
j    8.0
k    NaN
dtype: float64

新索引值当前值缺失,则需要插值

前向值填充method=’ffill’,最后索引j对应的值来填充

In [19]: obj1 = obj.reindex([\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'h\',\'i\',\'j\',\'k\'],metho
    ...: d=\'ffill\')

In [20]: obj1
Out[20]:
a    3
b    2
c    5
d    7
e    6
f    9
g    0
h    1
i    4
j    8
k    8
dtype: int64

前向值搬运method=’pad’,最后索引j对应的值来填充

In [23]: obj1 = obj.reindex([\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'h\',\'i\',\'j\',\'k\'],metho
    ...: d=\'pad\')

In [24]: obj1
Out[24]:
a    3
b    2
c    5
d    7
e    6
f    9
g    0
h    1
i    4
j    8
k    8
dtype: int64

后向值填充method=’bfill’,最后索引j的后面的索引对应的值来填充,j的后一个位置为NaN的空行

In [62]: obj2 = obj.reindex([\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'k\',\'h\',\'i\',\'j\'],metho
     ...: d=\'bfill\')

In [63]: obj2
Out[63]:
a    3.0
b    2.0
c    5.0
d    7.0
e    6.0
f    9.0
g    0.0
k    NaN
h    1.0
i    4.0
j    8.0
dtype: float64

后向值搬运method=’backfill’,最后索引j的后面的索引对应的值来填充,j的后一个位置为NaN的空行

In [64]: obj2 = obj.reindex([\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'k\',\'h\',\'i\',\'j\'],metho
    ...: d=\'backfill\')

In [65]: obj2
Out[65]:
a    3.0
b    2.0
c    5.0
d    7.0
e    6.0
f    9.0
g    0.0
k    NaN
h    1.0
i    4.0
j    8.0
dtype: float64

DataFrame的reindex方法

修改(行)索引、列,或两个都修改。

引入一个序列,则重新索引行,如下:

In [86]: data = {\'class\':[\'语文\',\'数学\',\'英语\'],\'score\':[120,130,140]}

In [87]: frame = DataFrame(data)

In [88]: frame
Out[88]:
  class  score
0    语文    120
1    数学    130
2    英语    140

In [89]: frame2 = frame.reindex([0,1,2,3])

In [90]: frame2
Out[90]:
  class  score
0    语文  120.0
1    数学  130.0
2    英语  140.0
3   NaN    NaN

行、列 都修改

In [94]: frame3 = frame.reindex(index=[11,22,33],columns = [\'a\',\'b\',\'c\',\'d\'])

In [95]: frame3
Out[95]:
     a   b   c   d
11 NaN NaN NaN NaN
22 NaN NaN NaN NaN
33 NaN NaN NaN NaN

reindex的参数如下:

image

第二 删除指定轴(索引)上的项

Series

In [112]: obj = Series([1,2,3,4],index=[\'a\',\'b\',\'c\',\'d\'])

In [113]: obj
Out[113]:
a    1
b    2
c    3
d    4
dtype: int64

In [114]: obj1 = obj.drop(\'c\')

In [115]: obj1
Out[115]:
a    1
b    2
d    4
dtype: int64

DataFrame

删除单索引行

In [109]: frame
Out[109]:
  class  score
0    语文    120
1    数学    130
2    英语    140

In [110]: obj = frame.drop(0)

In [111]: obj
Out[111]:
  class  score
1    数学    130
2    英语    140

删除多索引行

In [119]: frame
Out[119]:
  class  score
0    语文    120
1    数学    130
2    英语    140

In [120]: frame.drop([1,2])
Out[120]:
  class  score
0    语文    120

删除多索引行(带axis)

In [130]: frame
Out[130]:
  class  score
0    语文    120
1    数学    130
2    英语    140

In [131]: frame.drop([1,2],axis=0)
Out[131]:
  class  score
0    语文    120

删除列(columns)(带axis)

In [135]: frame
Out[135]:
  class  score
0    语文    120
1    数学    130
2    英语    140

In [136]: frame.drop([\'class\'],axis=1)
Out[136]:
   score
0    120
1    130
2    140

其中,axis=0,表示行,axis=1,表示列

第三 索引、选取与过滤

Series

In [1]: from pandas import Series,DataFrame

In [2]: obj = Series([1,2,3,4],index=[\'a\',\'b\',\'c\',\'d\'])

In [3]: obj
Out[3]:
a    1
b    2
c    3
d    4
dtype: int64

In [4]: obj[1]
Out[4]: 2

In [5]: obj[\'c\']
Out[5]: 3

In [6]: obj[1:2]
Out[6]:
b    2
dtype: int64

In [7]: obj[2:4]
Out[7]:
c    3
d    4
dtype: int64

DataFrame

In [13]: from pandas import DataFrame,Series

In [14]: data = DataFrame([[1,2,3],[4,5,6],[7,8,9]],index=[\'a\',\'b\',\'c\'],columns
    ...: =[\'aa\',\'bb\',\'cc\'])

In [15]: data
Out[15]:
   aa  bb  cc
a   1   2   3
b   4   5   6
c   7   8   9

索引方式一

In [16]: data[\'bb\']
Out[16]:
a    2
b    5
c    8
Name: bb, dtype: int64

索引方式二

In [19]: data[:2]
Out[19]:
   aa  bb  cc
a   1   2   3
b   4   5   6

索引方式三

In [20]: data[data<4]
Out[20]:
    aa   bb   cc
a  1.0  2.0  3.0
b  NaN  NaN  NaN
c  NaN  NaN  NaN

In [21]: data[data<4]=0

In [22]: data
Out[22]:
   aa  bb  cc
a   0   0   0
b   4   5   6
c   7   8   9

索引方式四

In [24]: data.ix[:2,[\'aa\',\'cc\']]
Out[24]:
   aa  cc
a   0   0
b   4   6

第四 算术运算与数据对齐

Series

In [36]: a1
Out[36]:
a    1
b    2
c    3
d    4
e    5
dtype: int64

In [37]: a2
Out[37]:
a    2
b    3
c    4
f    5
g    6
dtype: int64

a1+a2

In [38]: a1+a2
Out[38]:
a    3.0
b    5.0
c    7.0
d    NaN
e    NaN
f    NaN
g    NaN
dtype: float64

DataFrame

In [47]: import numpy as np

In [48]: b1 = DataFrame(np.arange(12.).reshape((3,4)),columns=list(\'abcd\'))

In [49]: b1
Out[49]:
     a    b     c     d
0  0.0  1.0   2.0   3.0
1  4.0  5.0   6.0   7.0
2  8.0  9.0  10.0  11.0

In [50]: b2 = DataFrame(np.arange(20.).reshape((4,5)),columns=list(\'abcde\'))

In [51]: b2
Out[51]:
      a     b     c     d     e
0   0.0   1.0   2.0   3.0   4.0
1   5.0   6.0   7.0   8.0   9.0
2  10.0  11.0  12.0  13.0  14.0
3  15.0  16.0  17.0  18.0  19.0

In [52]: b1+b2
Out[52]:
      a     b     c     d   e
0   0.0   2.0   4.0   6.0 NaN
1   9.0  11.0  13.0  15.0 NaN
2  18.0  20.0  22.0  24.0 NaN
3   NaN   NaN   NaN   NaN NaN

对NaN进行指定值填充

In [53]: b1.sub(b2,fill_value=0)
Out[53]:
      a     b     c     d     e
0   0.0   0.0   0.0   0.0  -4.0
1  -1.0  -1.0  -1.0  -1.0  -9.0
2  -2.0  -2.0  -2.0  -2.0 -14.0
3 -15.0 -16.0 -17.0 -18.0 -19.0

DataFrame与Series运算

In [101]: b1
Out[101]:
     a    b     c     d
0 0.0 1.0 2.0 3.0
1  4.0  5.0   6.0   7.0
2  8.0  9.0  10.0  11.0

In [102]: b1.ix[0]
Out[102]:
a 0.0 b 1.0 c 2.0 d 3.0

Name: 0, dtype: float64

In [103]: b1-b1.ix[0]
Out[103]:
     a    b    c    d
0 0.0 0.0 0.0 0.0
1  4.0  4.0  4.0  4.0
2  8.0  8.0  8.0  8.0

第五 函数应用于映射

In [111]: b1
Out[111]:
     a    b     c     d
0  0.0  1.0   2.0   3.0
1  4.0  5.0   6.0   7.0
2  8.0  9.0  10.0  11.0

In [112]: f = lambda x:x.max()-x.min()

In [113]: b1.apply(f)
Out[113]:
a    8.0
b    8.0
c    8.0
d    8.0
dtype: float64

找出DataFrame中每列的最大值和最小值

In [1]: import numpy as np

In [2]: from pandas import DataFrame,Series

In [3]: import pandas as pd

In [4]: b1 = DataFrame(np.arange(12.).reshape((3,4)),columns=list(\'abcd\'))

In [5]: b1
Out[5]:
     a    b     c     d
0  0.0  1.0   2.0   3.0
1  4.0  5.0   6.0   7.0
2  8.0  9.0  10.0  11.0

In [6]: def f(x):
   ...:     return Series([x.min(),x.max()],index=[\'min\',\'max\'])
   ...:

In [7]: b1.apply(f)
Out[7]:
       a    b     c     d
min  0.0  1.0   2.0   3.0
max  8.0  9.0  10.0  11.0

第六 排序和排名

排序

Series

obj.sort_index()

In [19]: obj = Series([4,np.nan,7,np.nan,-3,2])

In [20]: obj
Out[20]:
0    4.0
1    NaN
2    7.0
3    NaN
4   -3.0
5    2.0
dtype: float64

In [21]: obj.sort_index()
Out[21]:
0    4.0
1    NaN
2    7.0
3    NaN
4   -3.0
5    2.0
dtype: float64

In [22]: obj.sort_values()
Out[22]:
4   -3.0
5    2.0
0    4.0
2    7.0
1    NaN
3    NaN
dtype: float64

DataFrame

默认升序

data.sort_index()

data.sort_index(axis=1)

data.sort_index(axis=1,ascending=False)

排名

Series

排名会有一个排名值,从1开始。

rank()是平均排名,也就是会出现同排名值的情况。

但是可以通过如下method选项去破坏平级关系:

image

In [38]: obj = Series([3,4,2,1,5,7,9,0])

In [39]: obj
Out[39]:
0    3
1    4
2    2
3    1
4    5
5    7
6    9
7    0
dtype: int64

In [40]: obj.rank()
Out[40]:
0    4.0
1    5.0
2    3.0
3    2.0
4    6.0
5    7.0
6    8.0
7    1.0
dtype: float64

In [41]: obj.rank(method=\'first\')
Out[41]:
0    4.0
1    5.0
2    3.0
3    2.0
4    6.0
5    7.0
6    8.0
7    1.0
dtype: float64

In [42]: obj.rank(ascending=False,method=\'min\')
Out[42]:
0    5.0
1    4.0
2    6.0
3    7.0
4    3.0
5    2.0
6    1.0
7    8.0
dtype: float64

DataFrame

In [44]: data = DataFrame({\'b\':[4,7,-3,2],\'a\':[0,1,0,1],\'c\':[-2,5,6,7]})

In [45]: data
Out[45]:
   a  b  c
0  0  4 -2
1  1  7  5
2  0 -3  6
3  1  2  7

In [46]: data.rank(axis=1)
Out[46]:
     a    b    c
0  
2.0 3.0 1.0
1  1.0  3.0  2.0
2  2.0  1.0  3.0
3  1.0  2.0  3.0

axis表示行,axis=1表示第一行进行排名,0、4、-2,默认从小到大升序,应该是-2、0、4,所以0的排名值应该是2.0;4的排名值是3.0;-2的排名值是1.0

第七 带有重复值的轴索引

通过is_unique属性可以判断索引是否唯一。

以上是关于利用Python进行数据分析_Pandas_基础_2的主要内容,如果未能解决你的问题,请参考以下文章

利用Python进行数据分析_Pandas_数据加载存储与文件格式

《利用python进行数据分析》之《第二章引言》学习笔记_2

python数据分析基础005 -pandas详解_pandas入门这一篇就足够了

python:pandas计算时间差

Python __ Pandas

Python 2.7_pandas连接MySQL数据处理_20161229