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

被折叠的 条评论
为什么被折叠?



