功能包括但不限于:
1.按轴自动或显式数据对齐功能的数据结构
2.集成时间序列功能
3.数学运算和约简
4.灵活处理缺失数据
5.常见数据库的关系型运算
引入约定:
In [1]: from pandas import Series, DataFrame
In [2]: import pandas as pd
pandas的数据结构介绍
Series和DataFrame
Series
obj=Series([4,7,-5,3])
obj
0 4
1 7
2 5
3 -4
dtype: int64
左边是索引,右边是值,分别由obj.index和obj.values获取
obj2 = Series([4,7,5,-4],index=['d','a','c','b']) #这里我们自定义索引值
可以通过索引的方式选取\添加和改变Series中的单个或一组值,用法跟字典类似
NumPy的数组运算(如根据布尔型数组进行过滤\标量乘法\应用数学函数等)都会保留索引和值之间的链接关系
obj2[obj>0]
obj2 * 2
np.exp(obj2)
可以将Series看成是一个定长的有序字典
'b' in obj2
True
如果数据存放在python字典中,也可以直接通过这个字典来创建Series
obj3 = Series(dic) 索引就是键
若存在另外一个列表list
obj4 = Series(dic, index=list) 如果list中的「索引」没有对应的值,会显示NaN
pandas的isnull和notnull函数可用于检测缺失数据
Series的一个重要功能:它在算术运算中会自动对齐不同索引的数据:
注意与NaN的算术运算总会返回NaN
Series对象及其索引都有一个name属性,该属性跟pandas其他关键功能关系非常密切
obj.name = 'abc'
obj.index,name = 'def'
Series的索引可以通过赋值的方式就地修改(不能多也不能少)
obj.index=list
DataFrame
一个表格型的数据结构,有行索引和列索引,可以看做是由Series组成的字典(共用同一个索引)
最常用的构建DataFrame方法:直接传入一个由等长列表或NumPy数组组成的字典
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = DataFrame(data)
frame
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
可以用columns和index指定列索引和行索引,若传入的列在数据中找不到,就会产生NaN值,行不能多或少否则报错
通过类似字典标记的方式,可以获取将DataFrame的列获取为一个Series
frame2['year']
注意返回的Series拥有相同索引,且name属性也已被相应设置好
行可以通过索引字段ix获取
frame2.ix['two']
列可以通过赋值的方式进行修改;
将列表或数组赋值给某个列时,长度必须与DataFrame长度匹配;
如赋值的是一个Series,就会精确匹配到DataFrame的索引,空位将天上缺失值(注意这个Series需要加索引值)
为不存在的列赋值会创建一个新列;
关键字del用于删除列
del frame2['year'] 必须是中括号不能是frame2.year
通过索引方式返回的是相应数据的视图不是副本,因此对返回Series所做的修改会反映到源DataFrame上;通过Series的copy方法可显式的复制列
另一种常见的数据形式是嵌套字典
pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
frame3 = DataFrame(pop)
外层字典的键作为列\内层键作为索引
内层键会被合并\排序形成最终的索引,可以指定索引
frame3 = DataFrame(pop, index = [2001, 2002, 2003])
表5-1列出了DataFrame所能接受的各种数据
可以给DataFrame的index和columns设置name属性,这些信息就会显示出来
values属性会以二位ndarray的形式返回DataFrame中的数据
索引对象
pandas的索引对象负责管理轴标签和其他元数据(比如轴名称)
Index对象不可修改(immutable),这样才能使Index对象在多个数据结构之间安全共享
表5-2 pandas中主要的Index对象
表5-3 Index的方法和属性
基本功能
介绍操作Series和DataFrame的基本手段
重新索引
reindex\作用是创建一个适应新索引的新对象
obj=Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0) 这里如果不填写就会引入NaN
reindex的(插值)method选项
ffill或pad\前向填充或搬运值
bfill或backfill\向后填充或搬运值
obj3.reindex(range(6),method='ffill')
0 blue
1 blue
2 purple
3 purple
4 yellow
5 yellow
dtype: object
丢弃指定轴上的项
drop()相应的columns或index,注意是多个的话用列表形式
索引\选取和过滤
Series索引的工作方式类似于NumPy,只不过索引值不只是整数
obj = Series(np.arange(4.), index=['a', 'b', 'c', 'd'])
obj
a 0.0
b 1.0
c 2.0
d 3.0
obj['b']\1.0
obj[1]\1.0
obj[2:4]
c 2
d 3
obj[['b', 'a', 'd']]
b 1
a 0
d 3
obj[obj < 2]
a 0
b 1
利用标签的切片运算与普通的python切片运算不同,其末端是包含(inclusive)的(封闭区间)
obj['b':'c']
b 1
c 2
引入字段ix对DataFrame的行上进行标签索引
data=DataFrame(np.arange(16).reshape((4,4)),index=['Ohio','Colorado','Utah','New York'],columns=['one','two','three','four'])
data.ix['Colorado', ['two', 'three']]
表5-6 DataFrame的索引选项
算术运算和数据对齐
注意对应关系以及和NaN运算结果始终为NaN
在算术方法中填充值
灵活的算术方法
add(+)
sub(-)
div(/)
mul(*)
使用类似方法可以传入fill_value参数替代缺失值
DataFrame和Series之间的运算
广播(第十二章详解)
函数应用和映射
NumPy的ufuncs(元素级数组方法)也可以用于pandas对象
另一个常见操作是,将函数应用到由各列或行所形成的一维数组上\
DataFrame的apply方法即可实现此功能
frame=DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])
f=lambdax:x.max()-x.min()
frame.apply(f) #默认是列索引
frame.apply(f,axis=1) #这个是行索引
def f(x):
return Series([x.min(),x.max()],index=['min','max'])
frame.apply(f)
b d e
min -2.216707 -1.101685 -0.717719
max 2.266630 1.664559 1.172415
此外,元素级的python函数也是可用的,假如你想得到frame中各个浮点值的格式化字符串,使用applymap
format=lambda x:'%.2f' % x
frame.applymap(format)
b d e
Utah -2.22 1.66 -0.72
Ohio 0.30 1.21 -0.65
Texas 2.27 -1.10 1.17
Oregon -0.49 0.38 -0.33
frame['e'].map(format) #对某一列操作函数
Utah -0.72
Ohio -0.65
Texas 1.17
Oregon -0.33
Name: e, dtype: object
排序和排名
对于Series,使用sort_index方法,返回一个根据index排序的新对象
obj.order()按值对Series排序
任何缺失值会被排到末尾
对于DataFrame,可根据任意轴上的索引进行排序,给sort_index()传入axis=1即可,默认为对index排序
默认是升序排序,ascending=False为降序排序
sort_index(by='b') 或 sort_index(by=['b', 'c'])
排名rank()
排名时用于破坏平级关系的method选项
'average'\'min'\'max'\'first'
带有重复值的轴索引
若某个索引对应多个值返回Series,对应单个值返回一个标量值
汇总和计算描述统计
axis\约简的轴,DataFrame中行用0,列用1(默认为0)
skipna\排除缺失值,默认是True
level\如果轴是层次化索引的(即MultiIndex),则根据level分组约简
describe用于一次性产生多个汇总统计
df.describe()
表5-10列出了所有与描述统计相关的方法
相关系数与协方差
Series的corr方法用于计算两个Series中重叠的\非NA的\按索引对齐的值的相关系数
df.series1.corr(df.series2)
类似的用cov计算协方差
另外对于一个DataFrame对象的corr和cov方法将返回完整的相关系数或协方差矩阵
利用DataFrame的corrwith方法,可以计算其列或行跟另一个Series或DataFrame之间的相关系数;
传入一个Series将会返回一个相关系数值Series(针对各列进行计算)
传入一个DataFrame则会计算按列名配对的相关系数
唯一值\值计数以及成员资格
isin\计算一个表示'Series各值是否包含于传入的值的序列中'的布尔型数组
unique\计算Series中的唯一值数组,按发现的顺序返回
value_counts\返回一个Series,其索引为唯一值,其值为频率,按技术支持降序排列
data=DataFrame({'Qu1':[1,3,4,3,4],'Qu2':[2,3,1,2,3],'Qu3':[1,5,2,4,4]})
data
Qu1 Qu2 Qu3
0 1 2 1
1 3 3 5
2 4 1 2
3 3 2 4
4 4 3 4
将pd.value_counts传给该DataFrame的apply函数
result = data.apply(pd.value_counts).fillna(0)
result
Qu1 Qu2 Qu3
1 1.0 1.0 1.0
2 0.0 2.0 1.0
3 2.0 2.0 0.0
4 2.0 0.0 2.0
5 0.0 0.0 1.0
处理缺失数据
pandas使用浮点值NaN表示浮点和非浮点数组中的缺失数据;
python内置的None值也会当做NA处理
dropna\根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度
fillna\用指定值或插值方法填充缺失数据
滤除缺失数据
对于Series,dropna返回仅含非空数据和索引值的Series;也可以用notnull()布尔索引值方法达到相同结果
对于DataFrame,默认丢弃任何含有缺失值的行;
传入how='all',将只丢弃全为NA的行;
传入axis=1,将丢弃列
填充缺失数据
fillna()
传入常数\传入字典\也可以传入data.mean()平均数,中文数之类的
fillna默认返回新对象,传入inplace=True会覆盖源对象
层次化索引
它能使你在一个轴上拥有多个索引级别\能以低纬度形式处理高维度数据
重排分级顺序
swaplevel接受两个级别编号或名称,并返回一个互换级别的新对象(但数据不会发生变化)
根据级别汇总统计
level选项用于指定某条轴上求和的级别(利用了groupby功能)
使用DataFrame的列
将DataFrame的一个或多个列当做行索引来用,或者可能将行索引变成DataFrame的列.
set_index()\将列转换为行索引(传入columns的标签),默认会移除这些列,传入drop=False将其保留
reset_index刚好相反
其他有关pandas的话题
整数索引
面板数据
Panel数据结构,三维版的DataFrame