chapter5 Pandas入门

来源:互联网 发布:企业数据库视频教程 编辑:程序博客网 时间:2024/06/06 01:59

chapter5 Pandas入门

《Python for Data Analysis》学习记录

pandas的数据结构介绍

pandas中两个主要的数据结构为:Series,DataFrame。

  • Series:是一种类似于一维数组的对象,有一组数据以及一组与之相关的数据标签组成。
  • DataFrame:是一个表格型的数据结构,包含有一组有序的列,每一列可以使不同的值类型(数值、字符串、布尔值等)

处理缺失数据

缺失数据在大部分数据分析中都很常见。pandas的设计目标之一就是让缺失数据的处理任务尽量轻松。
pandas使用NaN表示浮点和非浮点数组中的缺失数据。

表:NA的 处理方法

方法 说明 dropna 根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度 fillna 用于指定值或插值方法填充缺失数据 isnull 返回一个含有布尔值的对象,表示缺失与否 notnull 与isnull相反

滤除缺失数据

对于一个Series,dropna返回一个仅仅含非空数据和索引值的Series:

import pandas as pdfrom numpy import nan as NAfrom pandas import Series, DataFramedata = Series([1,NA,3.5,NA,7])data.dropna()# 输出:# 0  1.0# 2  3.5# 4  7.0

也可以使用 布尔型索引达到同样的效果:

data[data.notnull()]

而对于DataFrame对象,默认为丢弃任何含有缺失值的行:

这里写代码片

传入how='all'将只丢弃全为NA的那些行:

这里写代码片

使用此种方法丢弃列,传入axis=1即可:
data.dropna(axis=1, how='all')

填充缺失数据

使用fillna()方法,通过一个常数调用fillna就可以将缺失值替换为那个常数值:

df = DataFrame(np.random.randn(7,3))df.ix[:4, 1] = NAdf.ix[:2, 2] = NA>>> df          0         1         20  2.129052       NaN       NaN1 -0.160965       NaN       NaN2 -1.090751       NaN       NaN3 -0.695483       NaN  0.7640654  0.140421       NaN  1.1274415  0.127681 -1.007816  0.0424046 -0.081363 -0.595110 -0.152502>>> df.fillna(0)          0         1         20  2.129052  0.000000  0.0000001 -0.160965  0.000000  0.0000002 -1.090751  0.000000  0.0000003 -0.695483  0.000000  0.7640654  0.140421  0.000000  1.1274415  0.127681 -1.007816  0.0424046 -0.081363 -0.595110 -0.152502

通过一个字典调用fillna,可以实现对不同的列填充不同的值:

>>> df.fillna({1:2.1, 3:3.2})          0         1         20  2.129052  2.100000       NaN1 -0.160965  2.100000       NaN2 -1.090751  2.100000       NaN3 -0.695483  2.100000  0.7640654  0.140421  2.100000  1.1274415  0.127681 -1.007816  0.0424046 -0.081363 -0.595110 -0.152502

层次化索引

层次化索引(hierarchical indexing)是pandas的一项重要功能,使得能在一个轴上拥有多个(两个以上)索引级别。抽象点来说就是,是你可以以低维度形式处理高维度数据。
例:创建一个Series,并使用一个由列表或数组组成的列表作为索引。

data = Series(np.random.randn(10),index=                    [['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'], [1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])>>> dataa  1   -0.896044   2   -0.780102   3    0.105427b  1   -1.892290   2   -1.771580   3   -2.018065c  1   -0.613627   2   -1.596825d  2    1.667650   3    0.610973dtype: float64

这就是带有MultiIndex索引的Series的格式化输出形式。索引之间的“间隔”表示“直接使用上面的标签”:

>>> data.indexMultiIndex(levels=[['a', 'b', 'c', 'd'], [1, 2, 3]],labels=[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 1, 2]])

对于一个层次化索引的对象,选取数据子集的操作也时比较容易:

>>> data['b':'c']b  1   -1.892290   2   -1.771580   3   -2.018065c  1   -0.613627   2   -1.596825dtype: float64

还可以在内层中选择:

>>> data[:,2]a   -0.780102b   -1.771580c   -1.596825d    1.667650dtype: float64

层次化索引在数据重塑和基于分组操作中扮演着重要的角色。如使用unstack方法将数据重新安排到一个DataFrame中:

>>> data.unstack()          1         2         3a -0.896044 -0.780102  0.105427b -1.892290 -1.771580 -2.018065c -0.613627 -1.596825       NaNd       NaN  1.667650  0.610973

unstack的逆运算是stack:

>>> data.unstack().stack()a  1   -0.896044   2   -0.780102   3    0.105427b  1   -1.892290   2   -1.771580   3   -2.018065c  1   -0.613627   2   -1.596825d  2    1.667650   3    0.610973dtype: float64