利用pandas进行数据分析(一):Series和DataFrame数据结构

浏览: 2067

对于Python而言,坊间早有这种说法:在有了 pandas之后,Python才算有了数据分析的能力。在此之前,要想用Python来做数据分析,可能就没那么友好了,可见pandas在学习数据分析时候的重要程度。对于 pandas来说,很多功能的实现也是要基于科学计算库 numpy的,所以 numpy+ pandas的组合在Python数据分析中就显得尤为关键。

    从本篇开始,小编就给大家详细讲解 pandas的基本用法和应用案例,熟悉R的朋友们也可以将其与R的数据分析功能进行对比,定能有所收获。本篇先对 pandas的数据结构进行介绍,跟R大不相同的是,Python并没有太多不同的数据结构和对象, pandas中主要包括 SeriesDataFrame两种数据结构。

Series

Series有点类似于 numpy中的一维数组对象,一般由一组数据和数据相关的标签或者索引构成,由一组数构成最简单的 Series如下:

  1. from numpy import *

  2. from pandas import *

创建 Series

  1. obj = Series([-1,3,-4,6])

  2. print(obj)

  3. 0   -1

  4. 1    3

  5. 2   -4

  6. 3    6

  7. dtype: int64

    可以看到的是,由一组数创建的 Series对象索引在左边,值在右边。我们也可以通过索引和值标签分别访问相应的对象:

  1. #Series对象值

  2. obj.values

  3. array([-1,  3, -4,  6], dtype=int64)

  4. #Series对象索引

  5. obj.index

  6. RangeIndex(start=0, stop=4, step=1)

当然,我们可以在创建Series对象的时候就对索引进行标记或者命名:

  1. #对Series索引进行命名或者标记

  2. obj2 = Series([-1,3,-4,6],index = ['a','b','c','d'])

  3. print(obj2)

  4. a   -1

  5. b    3

  6. c   -4

  7. d    6

  8. dtype: int64

  9. #查看索引

  10. obj2.index

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

    根据 Series索引访问对象值:

  1. obj2['a']

  2. -1

  3. obj2[['a','b','c']]

  4. a   -1

  5. b    3

  6. c   -4

  7. dtype: int64

    也可以对Series对象进行数组运算:

  1. obj2[obj2 > 0]

  2. b    3

  3. d    6

  4. dtype: int64

  5. obj2*2

  6. a    -2

  7. b     6

  8. c    -8

  9. d    12

  10. dtype: int64

  11. np.exp(obj2)

  12. a      0.367879

  13. b     20.085537

  14. c      0.018316

  15. d    403.428793

  16. dtype: float64

    除了直接以数组形式创建 Series对象之外,通过字典来生成 Series也是较为普遍的做法:

  1. nba = {'Kobe Bryant':30.3,'Allen Iverson':29.4,'Tracy McGrady':30.1,'Vince Carter':25.6}

  2. obj3 = Series(nba)

  3. print(obj3)

  4. Allen Iverson    29.4

  5. Kobe Bryant      30.3

  6. Tracy McGrady    30.1

  7. Vince Carter     25.6

  8. dtype: float64

创建完之后可以对 Series对象和索引进行命名:

  1. obj3.name = 'nbastats'

  2. obj3.index.name = 'player'

  3. print(obj3)

  4. player

  5. Allen Iverson    29.4

  6. Kobe Bryant      30.3

  7. Tracy McGrady    30.1

  8. Vince Carter     25.6

  9. Name: nbastats, dtype: float64

另外, Series索引可以随时进行更改:

  1. obj3.index = ['A.Iverson','K.Bryant','T.McGrady','V.Carter']

  2. print(obj3)

  3. A.Iverson    29.4

  4. K.Bryant     30.3

  5. T.McGrady    30.1

  6. V.Carter     25.6

  7. Name: nbastats, dtype: float64

    除了上述创建 Series对象的方法以外,从 DataFrame中单独拿出一行也可以用来创建 Series。关于 Series数据结构的基本内容就介绍到这里,下面看 DataFrame

DataFrame

    说到 DataFrame,可能大家更熟悉的是R语言中的 data.frame,Python中的 DataFrame跟它也较为类似。在Python中, DataFrame是一个表格型的数据结构,它含有一组有序的列,每列的数据类型可以不一样,与R中的数据框相比,Python中的 DataFrame行列操作较为平衡。 构建DataFrame方法很多,最常用的是直接传入一个由等长列表或NumPy数组组成的字典:

  1. data = {'city':['LAL','HOU','PHI','TOR'],

  2.        'year':[1996,1997,1996,1997],

  3.        'score':[30.3,30.1,29.4,25.6]}

  4. frame = DataFrame(data)

  5. frame

  6.    city    score   year

  7. 0    LAL 30.3    1996

  8. 1    HOU 30.1    1997

  9. 2    PHI 29.4    1996

  10. 3    TOR 25.6    1997

    可以看到,字典在转化为数据框的过程中,键是作为列名而存在的。

  1. #按指定列进行排列

  2. DataFrame(data,columns=['year','city','score'])

  3.    year    city    score

  4. 0    1996    LAL 30.3

  5. 1    1997    HOU 30.1

  6. 2    1996    PHI 29.4

  7. 3    1997    TOR 25.6

    根据字典传入时,若是指定列找不到数据则会自动填补为缺失:

  1. #若传入的列找不到数据则会产生NA

  2. frame2 = DataFrame(data,columns=['year','city','score','assist'],

  3.                   index=[1,2,3,4])

  4. print(frame2)

  5.  year city  score assist

  6. 1  1996  LAL   30.3    NaN

  7. 2  1997  HOU   30.1    NaN

  8. 3  1996  PHI   29.4    NaN

  9. 4  1997  TOR   25.6    NaN

    如前述,我们可以通过 data.frame来获取一个 Series对象:

  1. frame2['city']

  2. 1    LAL

  3. 2    HOU

  4. 3    PHI

  5. 4    TOR

  6. Name: city, dtype: object

  7. frame2.score

  8. 1    30.3

  9. 2    30.1

  10. 3    29.4

  11. 4    25.6

  12. Name: score, dtype: float64

    也可以通过 loc方法访问 DataFrame的行:

  1. frame2.loc[3]

  2. year      1996

  3. city       PHI

  4. score     29.4

  5. assist     NaN

  6. Name: 3, dtype: object

    对缺失的变量进行重新赋值:

  1. frame2['assist']=5.6

  2. print(frame2)

  3. year city  score  assist

  4. 1  1996  LAL   30.3     5.6

  5. 2  1997  HOU   30.1     5.6

  6. 3  1996  PHI   29.4     5.6

  7. 4  1997  TOR   25.6     5.6

    按索引传入时,没有被指定的记录产生缺失:

  1. val = Series([4.5,3.9],index=[1,4])

  2. frame2['assist']=val

  3. print(frame2)

  4. year city  score  assist

  5. 1  1996  LAL   30.3     4.5

  6. 2  1997  HOU   30.1     NaN

  7. 3  1996  PHI   29.4     NaN

  8. 4  1997  TOR   25.6     3.9

    对于嵌套字典转化为 DataFrame,一般外层字典的键作为列,内层字典的键作为行索引:

  1. nba = {'kobe':{2005:35.6,2006:32.1},'McGrady':{2005:26.7,2006:24.3}}

  2. frame3 = DataFrame(nba)

  3. print(frame3)

  4. McGrady  kobe

  5. 2005     26.7  35.6

  6. 2006     24.3  32.1

    关于pandas的两种基本数据结构SeriesDataFrame,小编就暂且介绍到这里了,关于如何在实际的数据分析过程熟练使用这两种数据结构的基本操作,小编在后续的推文中会进一步的讲解。

往期精彩:

从numpy开启Python数据科学之旅

R数据处理包plyr:超越apply函数族的向量化运算

gganimate:构建R语言可视化gif动图

使用jupyter notebook搭建数据科学最佳交互式环境

R编程特性1:向量与向量化

R Markdown|可能是你数据分析报告最好的解决方案

如何写出整洁规范的R代码?是时候讨论一下代码规范性了

R语言向量化运算:apply函数族用法心得

Python面向对象编程:数据封装、继承和多态

[译]为什么R语言是当今最值得学习的数据科学语言


一个数据科学热爱者的学习历程

image.png

推荐 1
本文由 鲁伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册