1. Pandas 介绍
Pandas 的名称来自于面板数据(panel data)和 Python 数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在 Pandas 中也提供了 panel 的数据类型。
pandas 的数据结构分类:
- Series:一维数组,与 Numpy 中的一维 array 类似。二者与 Python 基本的数据结构 List 也很相近,其区别是:List 中的元素可以是不同的数据类型,而 Array 和 Series 中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
- Time- Series:以时间为索引的 Series。
- DataFrame:二维的表格型数据结构。很多功能与 R 中的 data.frame 类似。可以将DataFrame 理解为 Series 的容器。以下的内容主要以 DataFrame 为主。
- Panel :三维的数组,可以理解为 DataFrame 的容器。
使用下面这样的 pandas 引入约定:
from pandas import Series, DataFrame
import pandas as pd
2. Series 对象
Series 是一种类似于一维数组的对象,它由一组数据(各种 NumPy 数据类型)以及一组与之相关的数据标签(即索引)组成。
In [114]: obj = Series([4,7,-5,3])
In [115]: obj
Out[115]:
0 4
1 7
2 -5
3 3
dtype: int64
# 通过 Series 的 values 和 index 属性获取其数组表示形式和索引对象
In [116]: obj.values
Out[116]: array([ 4, 7, -5, 3], dtype=int64)
In [117]: obj.index
Out[117]: RangeIndex(start=0, stop=4, step=1)
# 使用 index 参数人为地设置索引符号
In [118]: obj2 = Series([4,7,-5,3],index=['a','b','c','d'])
In [119]: obj2
Out[119]:
a 4
b 7
c -5
d 3
dtype: int64
In [120]: obj2.index
Out[120]: Index([u'a', u'b', u'c', u'd'], dtype='object')
可以通过索引的方式获取 Series 中的单个或一组值
In [121]: obj2['a']
Out[121]: 4
In [122]: obj2['c'] = 100
In [123]: obj2[['b','c','d']]
Out[123]:
b 7
c 100
d 3
dtype: int64
数组运算(数组过滤、标量相乘、应用数学函数等)
In [125]: obj2[obj2 > 10]
Out[125]:
c 100
dtype: int64
In [126]: obj2 * 2
Out[126]:
a 8
b 14
c 200
d 6
dtype: int64
In [127]: np.exp(obj2)
Out[127]:
a 5.459815e+01
b 1.096633e+03
c 2.688117e+43
d 2.008554e+01
dtype: float64
可以将 Series 看成是一个定长的有序字典,从而判断索引键是否在数组中
In [128]: 'b' in obj2
Out[128]: True
In [129]: 'f' in obj2
Out[129]: False
通过字典来创建 Series
In [130]: d = {'a':100, 'b':200, 'c':300}
In [131]: obj3 = Series(d)
In [132]: obj3
Out[132]:
a 100
b 200
c 300
dtype: int64
In [133]: keys = ['a','b','c','d']
In [134]: obj4 = Series(d,index=keys)
In [135]: obj4
Out[135]:
a 100.0
b 200.0
c 300.0
d NaN
dtype: float64
由于 ‘d’ 所对应的值找不到,所以结果就会出现 NaN (not a number),在 pandas 中用于表示缺失或 NA 值
pandas 的 isnull 和 notnull 函数可用于检测缺失数据
In [138]: pd.isnull(obj4)
Out[138]:
a False
b False
c False
d True
dtype: bool
In [139]: pd.notnull(obj4)
Out[139]:
a True
b True
c True
d False
dtype: bool
# Series 也有类似的实例方法
In [140]: obj4.isnull()
Out[140]:
a False
b False
c False
d True
dtype: bool
Series 一个重要的功能:在算术运算中会自动对齐不同索引的数据
In [141]: obj3
Out[141]:
a 100
b 200
c 300
dtype: int64
In [142]: obj4
Out[142]:
a 100.0
b 200.0
c 300.0
d NaN
dtype: float64
In [143]: obj3 + obj4
Out[143]:
a 200.0
b 400.0
c 600.0
d NaN
dtype: float64
Series 对象本身及其索引都有一个 name 属性,可以随意设置属性值
In [144]: obj4.name = "This is obj4"
In [145]: obj4.index.name = "obj4-index"
In [146]: obj4
Out[146]:
obj4-index
a 100.0
b 200.0
c 300.0
d NaN
Name: This is obj4, dtype: float64
Series 的索引可以通过赋值的方式就地修改
In [147]: obj4.index = ['I', 'love', 'you', 'too']
In [148]: obj4
Out[148]:
I 100.0
love 200.0
you 300.0
too NaN
Name: This is obj4, dtype: float64