python进阶我爱编程

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

2017-09-17  本文已影响45人  nummycode

一.简介

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

pip install pandas

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

import pandas 
pandas.__version__

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

import numpy as np
import pandas as pd

二.Pandas对象

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

Pandas Series对象

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

data = pd.Series([0.25, 0.5, 0.75, 1.0])

结果如下:

0    0.25
1    0.50
2    0.75
3    1.00
dtype: float64

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

data.values
# array([ 0.25,  0.5 ,  0.75,  1.  ])

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

data.index
# RangeIndex(start=0, stop=4, step=1)

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

data[1]   #0.5

还支持切片:

data[1:3] 

结果为:

1    0.50
2    0.75
dtype: float64

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

data = pd.Series([0.25, 0.5, 0.75, 1.0],
                 index=['a', 'b', 'c', 'd'])

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

data['b']  # 0.5

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

data = pd.Series([0.25, 0.5, 0.75, 1.0],
                 index=[2, 5, 3, 7])

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

population_dict = {'California': 38332521,
                   'Texas': 26448193,
                   'New York': 19651127,
                   'Florida': 19552860,
                   'Illinois': 12882135}
population = pd.Series(population_dict)

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

population['California':'Illinois']

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

>>> pd.Series(data, index=index)

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

pd.Series([2, 4, 6])

结果为:

0    2
1    4
2    6
dtype: int64

data 也可以是一个标量:

pd.Series(5, index=[100, 200, 300])

结果为:

100    5
200    5
300    5
dtype: int64

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

pd.Series({2:'a', 1:'b', 3:'c'}, index=[3, 2])

结果为:

3    c
2    a
dtype: object

Pandas DataFrame对象

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

area_dict = {'California': 423967, 'Texas': 695662, 'New York': 141297,
             'Florida': 170312, 'Illinois': 149995}
area = pd.Series(area_dict)

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

states = pd.DataFrame({'population': population,
                       'area': area})

输出如下:

image.png

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

states.index
# Index(['California', 'Florida', 'Illinois', 'New York', 'Texas'], dtype='object')

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

states.columns
# Index(['area', 'population'], dtype='object')

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

states['area']

结果为:

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支持各种方式的构建:

data = [{'a': i, 'b': 2 * i}
        for i in range(3)]

结果如下:

image.png

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

pd.DataFrame([{'a': 1, 'b': 2}, {'b': 3, 'c': 4}])

结果如下:

image.png
pd.DataFrame({'population': population,
              'area': area})
pd.DataFrame(np.random.rand(3, 2),
             columns=['foo', 'bar'],
             index=['a', 'b', 'c'])
A = np.zeros(3, dtype=[('A', 'i8'), ('B', 'f8')])
pd.DataFrame(A)

结果如下:

image.png

Pandas Index对象

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

ind = pd.Index([2, 3, 5, 7, 11])

1.将Index看做不可变数组

ind[1]
# 3

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

indA = pd.Index([1, 3, 5, 7, 9])
indB = pd.Index([2, 3, 5, 7, 11])

求交集:

indA & indB  # intersection

求并集:

indA | indB  # union

求差集:

indA ^ indB  # symmetric difference

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

上一篇下一篇

猜你喜欢

热点阅读