chapter5 Pandas入门

本文介绍了Pandas库中的两种主要数据结构Series和DataFrame的基本使用方法,包括数据缺失的处理技巧,如利用dropna、fillna等方法滤除或填充缺失数据。同时,文章还详细解释了如何运用层次化索引来组织和操作多级索引数据。

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 pd
from numpy import nan as NA
from pandas import Series, DataFrame

data = 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] = NA
df.ix[:2, 2] = NA
>>> df
          0         1         2
0  2.129052       NaN       NaN
1 -0.160965       NaN       NaN
2 -1.090751       NaN       NaN
3 -0.695483       NaN  0.764065
4  0.140421       NaN  1.127441
5  0.127681 -1.007816  0.042404
6 -0.081363 -0.595110 -0.152502

>>> df.fillna(0)
          0         1         2
0  2.129052  0.000000  0.000000
1 -0.160965  0.000000  0.000000
2 -1.090751  0.000000  0.000000
3 -0.695483  0.000000  0.764065
4  0.140421  0.000000  1.127441
5  0.127681 -1.007816  0.042404
6 -0.081363 -0.595110 -0.152502

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

>>> df.fillna({1:2.1, 3:3.2})
          0         1         2
0  2.129052  2.100000       NaN
1 -0.160965  2.100000       NaN
2 -1.090751  2.100000       NaN
3 -0.695483  2.100000  0.764065
4  0.140421  2.100000  1.127441
5  0.127681 -1.007816  0.042404
6 -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]])
>>> data
a  1   -0.896044
   2   -0.780102
   3    0.105427
b  1   -1.892290
   2   -1.771580
   3   -2.018065
c  1   -0.613627
   2   -1.596825
d  2    1.667650
   3    0.610973
dtype: float64

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

>>> data.index
MultiIndex(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.018065
c  1   -0.613627
   2   -1.596825
dtype: float64

还可以在内层中选择:

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

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

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

unstack的逆运算是stack:

>>> data.unstack().stack()
a  1   -0.896044
   2   -0.780102
   3    0.105427
b  1   -1.892290
   2   -1.771580
   3   -2.018065
c  1   -0.613627
   2   -1.596825
d  2    1.667650
   3    0.610973
dtype: float64
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值