一.简介
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提供了以下几种基本的数据类型:
- Series
- DataFrame
- Index
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支持各种方式的构建:
- 从单个Series对象中构建
DataFrame是很多个Series对象的集合,单列的DataFrame可以从单个的Series对象来构建:pd.DataFrame(population, columns=['population'])
- 从字典列表中构建:
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'])
- 从Numpy结构型数组创建:
A = np.zeros(3, dtype=[('A', 'i8'), ('B', 'f8')])
pd.DataFrame(A)
结果如下:
image.pngPandas 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)
网友评论