前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python数据科学手册(三)【Pandas的对象介绍】

Python数据科学手册(三)【Pandas的对象介绍】

作者头像
用户2936342
发布2018-08-27 14:15:12
8650
发布2018-08-27 14:15:12
举报
文章被收录于专栏:nummynummy

一.简介

Pandas构建在Numpy的基础上,它同时支持行和列的操作。 使用pip进行安装:

代码语言:javascript
复制
pip install pandas

安装完之后,可以查看版本信息:

代码语言:javascript
复制
import pandas 
pandas.__version__

一般通过如下方式导入pandas,同时导入Numpy是因为Pandas的很多操作都依赖于Numpy

代码语言:javascript
复制
import numpy as np
import pandas as pd

二.Pandas对象

在底层实现上,可以认为Pandas是一个增强型的Numpy。Pandas提供了以下几种基本的数据类型:

  • Series
  • DataFrame
  • Index

Pandas Series对象

Pandas Series 是一个一维的数组对象,它可以从列表或者数组中创建。 1.从列表创建

代码语言:javascript
复制
data = pd.Series([0.25, 0.5, 0.75, 1.0])

结果如下:

代码语言:javascript
复制
0    0.25
1    0.50
2    0.75
3    1.00
dtype: float64

从上面可以看出,Series对象同时封装了值序列和索引序列,这些可以通过values和index属性分别获取,values实际上就是一个Numpy数组

代码语言:javascript
复制
data.values
# array([ 0.25,  0.5 ,  0.75,  1.  ])

而index属性则是一个类数组对象pd.Index,后面我们将讨论到

代码语言:javascript
复制
data.index
# RangeIndex(start=0, stop=4, step=1)

根Numpy数组一样,Series的值可以通过索引来获取:

代码语言:javascript
复制
data[1]   #0.5

还支持切片:

代码语言:javascript
复制
data[1:3] 

结果为:

代码语言:javascript
复制
1    0.50
2    0.75
dtype: float64

从上可以看出,同Numpy相比,Series对象更为通用和灵活。 2.从Numpy数组中创建 Pandas Series对象和Numpy 数组最大的区别就是Numpy只支持整数型数值索引,而Pandas Series支持各种类型的索引,而且可以显示声明索引。 例如:

代码语言:javascript
复制
data = pd.Series([0.25, 0.5, 0.75, 1.0],
                 index=['a', 'b', 'c', 'd'])

接下来就可以通过字符串进行索引了:

代码语言:javascript
复制
data['b']  # 0.5

我们甚至可以使用不连续的索引:

代码语言:javascript
复制
data = pd.Series([0.25, 0.5, 0.75, 1.0],
                 index=[2, 5, 3, 7])

3.通过字典创建 Pandas Series对象其实也可以理解为一个字典,每个索引对应一个值,只不过值得类型必须是一致的,因为一致,底层使用Numpy数组,从而更加高效。 从字典中创建Series:

代码语言:javascript
复制
population_dict = {'California': 38332521,
                   'Texas': 26448193,
                   'New York': 19651127,
                   'Florida': 19552860,
                   'Illinois': 12882135}
population = pd.Series(population_dict)

默认情况下,索引会根据排序后的keys进行创建。 根字典不同的是,Series支持类数组的操作,比如切片:

代码语言:javascript
复制
population['California':'Illinois']

4.通用的构建方法 总结上面的构造方法,基本都可以通过如下形式构造:

代码语言:javascript
复制
>>> pd.Series(data, index=index)

这里的index为可选参数,当index为空时,索引默认为整数序列。data可以为列表或者Numpy数组。

代码语言:javascript
复制
pd.Series([2, 4, 6])

结果为:

代码语言:javascript
复制
0    2
1    4
2    6
dtype: int64

data 也可以是一个标量:

代码语言:javascript
复制
pd.Series(5, index=[100, 200, 300])

结果为:

代码语言:javascript
复制
100    5
200    5
300    5
dtype: int64

当显式声明索引的时候,以后者为准:

代码语言:javascript
复制
pd.Series({2:'a', 1:'b', 3:'c'}, index=[3, 2])

结果为:

代码语言:javascript
复制
3    c
2    a
dtype: object

Pandas DataFrame对象

跟前面讨论的Series对象类似,DataFrame对象可以看做Numpy数组的一般化,也可以看为Python字典的特殊化。下面我们分别从这两种视角进行讲解。 1.一般化的Numpy数组 如果说Series是一个一维类数组对象,则DataFrame可以看做是二维类数组对象。你可以将DataFrame看做是Series对象的序列,只不过这些序列的索引是一致的。 下面新建一个Series,它使用的索引与前面的population一致:

代码语言:javascript
复制
area_dict = {'California': 423967, 'Texas': 695662, 'New York': 141297,
             'Florida': 170312, 'Illinois': 149995}
area = pd.Series(area_dict)

接着我们就可以通过area_dict 和population构建一个DataFrame了:

代码语言:javascript
复制
states = pd.DataFrame({'population': population,
                       'area': area})

输出如下:

image.png

跟Series对象一样,DataFrame也有一个index属性,可以获取行索引:

代码语言:javascript
复制
states.index
# Index(['California', 'Florida', 'Illinois', 'New York', 'Texas'], dtype='object')

除此之外,DataFrame还可以通过columns获取列索引:

代码语言:javascript
复制
states.columns
# Index(['area', 'population'], dtype='object')

2.特殊的字典 类似的,可以将DataFrame看做字典,key为列索引值,value为对应的Series对象。

代码语言:javascript
复制
states['area']

结果为:

代码语言:javascript
复制
California    423967
Florida       170312
Illinois      149995
New York      141297
Texas         695662
Name: area, dtype: int64

注意,对于二维的Numpy数组data来说, data[0]会返回第一行,对于DataFrame, data["col"]将返回某一列,这很容易混淆,所以一般讲DataFrame看做为字典。 3.构建 DataFrame Pandas DataFrame支持各种方式的构建:

  • 从单个Series对象中构建 DataFrame是很多个Series对象的集合,单列的DataFrame可以从单个的Series对象来构建: pd.DataFrame(population, columns=['population'])
  • 从字典列表中构建:
代码语言:javascript
复制
data = [{'a': i, 'b': 2 * i}
        for i in range(3)]

结果如下:

image.png

如果某些键值丢失,Pandas会补全为NaN

代码语言:javascript
复制
pd.DataFrame([{'a': 1, 'b': 2}, {'b': 3, 'c': 4}])

结果如下:

image.png

  • 从字典中构建:
代码语言:javascript
复制
pd.DataFrame({'population': population,
              'area': area})
  • 从二维数组构建 可以显示声明索引,如果没有声明,则使用默认的整数索引:
代码语言:javascript
复制
pd.DataFrame(np.random.rand(3, 2),
             columns=['foo', 'bar'],
             index=['a', 'b', 'c'])
  • 从Numpy结构型数组创建:
代码语言:javascript
复制
A = np.zeros(3, dtype=[('A', 'i8'), ('B', 'f8')])
pd.DataFrame(A)

结果如下:

image.png

Pandas Index对象

Index对象可以看做不可变数组或者排序的集合。

代码语言:javascript
复制
ind = pd.Index([2, 3, 5, 7, 11])

1.将Index看做不可变数组

代码语言:javascript
复制
ind[1]
# 3

Index对象跟Numpy数组很像,主要区别就是Index对象是不可修改的。 2.将Index看作排序的集合 Pandas对象被设计用来处理多个数据集,因此依赖很多集合操作。由于Index可以看做集合,因此它支持交、并、差等集合操作。

代码语言:javascript
复制
indA = pd.Index([1, 3, 5, 7, 9])
indB = pd.Index([2, 3, 5, 7, 11])

求交集:

代码语言:javascript
复制
indA & indB  # intersection

求并集:

代码语言:javascript
复制
indA | indB  # union

求差集:

代码语言:javascript
复制
indA ^ indB  # symmetric difference

这些操作也可以通过调用方法来实现,如indA.intersection(indB)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.09.17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.简介
  • 二.Pandas对象
    • Pandas Series对象
      • Pandas DataFrame对象
        • Pandas Index对象
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档