Python数据科学入门
Dmitry Zinoviev著
熊子源 译
第6章 使用Series和frame
Pandas模块的初中时为了给Python添加Series和frame两个抽象的数据结构,它们其实是Python的竞争对手、最早的数据科学语言——R语言的核心。
Pandas的frame本质是一个“智能”电子表格:具有标签、列(变量)、行(观测记录),以及大量内置操作的表。(Series是一个只有一列的frame)表的数据部分(单元格)以numpy数组的方式实现。
第31单元 pandas数据结构
Series
Series是一维的数据矢量。是同构的:Series中左右数据项必须是相同的数据类型。
Series中的函数:
- head() 返回Series中前五行数据(默认5行)
- tail() 返回Series中后五行数据(默认5行)
Frame
Frame是一个行和列都具有标签的表。可以通过二维numpy数组、元组列表、Python字典或一个frame构造出一个新的frame。
第32单元 数据重塑
索引:
Frame的索引是一组分配给frame行的标签集合。
reset_index() | 删除现有索引 |
---|---|
set_index() | 建立一个新索引 |
drop() | 返回一个删除了一行或若干行的frame的副本。 |
重建索引:
从现有的frame或series中选择一定的行排列、列排列或者行和列排列,来创建新的frame或Series。
分层索引:
也称为多级索引或多重索引。由以下三个列表组成:
- 级别名称
- 每个级别可能存在的所有标签
- Frame或Series中每一项的实际值的列表。
MultiIndex.from_tuples() 使用带有标签的元组和可选的级别名称列表生成多级索引。
堆叠和旋转:
使用多级的列名可以将多级索引完全或部分扁平化,相反,使用多级索引也可以将多级的列名完全或部分扁平化。
stack() | 增加索引的级别数,同时减少列名的级别数。 |
---|---|
unstack() | 增加列名的级别数,同时减少索引的级别数。 |
pivot(index,columns,values) | 将frame转换为另一个frame,新的frame使用列索引作为新的索引,columns作为新的列名列表,values作为数据。 |
第33单元 处理缺失数据
Pandas沿用了传统的numpy.nan(第5章-第25单元)来表示缺失数据。Pandas还提供了识别和插补缺失值的函数。
缺失值必须被删除或者插补(将其替换成有意义的值)。
删除缺失值:
dropna()函数
可以删除部分(how=”any”,默认)或全部(how=”all”)无效的列(axis=0,默认)或行(axis=1),并返回“干净的”frame对象。
插补缺失数据:
两种常见的插补技术是使用常数(0,1)和“干净”值得平均数替换缺失值。
isnull()和notnull()
是互补的。当某个值是nan时,isnull()返回True;当某个值不是nan时,notnull()返回True。
根据IEEE 754的浮点数标准,表达式
np.nan==np.nan为False
,这使得直接比较是不可能的!
替换数据:
replace(val_or_list,new_val)函数
将一个值或值列表替换成一个新的值或值列表,列表的长度必须一样。除非传递inplace=True参数(表示在原始表中修改),负责该函数会返回一个新的frame或series。
第34单元 组合数据
合并:
如果两个frame具有一个相同的列,就可以将该列上的frame合并。即使没有相同名称的列,也可以指定其他列作为键。
df = pd.merge(df1,df2,on=”key”)
df = pd.merge(df1,df2,left_on=”key1”,right_on=”key2”)
如果要在索引列而不是一般的列上合并,使用可选参数left_index=True和right_index=True实现。
join()和merge() 这两个函数使用同一个可选参数how,它的可接受参数为“left”(join()的默认值),“right”,“inner”,“outer”(merge()的默认值)
连接:
Concat()函数
通过一组frame彼此“竖直”(axis=0,默认值)或“水平”(axis=1)放置在一起来连接它们,并返回一个新的frame。
Pd.concat([alco2009,population],axis=0).tail()
如果frame的维度不匹配,pandas就会在所谓的“空位”处加入具有缺失值的行或列。
删除重复行:
duplicated([subset],keep=””)
返回一个布尔型的Series,表示在所有列或subset(是一个列名称组成的序列)表示的列中是否有重复的行。Keep表示控制标记的重复行是第一个重复行(“first”)、最后一个重复行(“last”)、每个重复行(“True”)都标记。
drop_duplicates([subset],keep=””,Inpalce=True)
返回一个删除了所有列或subset(是一个列名称组成的序列)表示的列中重复行的frame或Series。Keep表示控制删除的行是第一个重复行(“first”)、最后一个重复行(“last”)、每个重复行(“True”)都删除。Inpalce=True可以从原始对象中删除重复项。
第35单元 数据的排序和描述
排序和分级:
sort_index()返回按照索引排序的frame。相关参数说明如下:
ascending | (默认值为True(升序))来控制升序或降序; |
---|---|
na_position | (取值为“first”或”last“)指定值为nan的单元在排序后的位置, |
numeric_only | 仅将等级限制为数值 |
na_option | (取值为“top”,”bottom”或“keep”)设定nan的处理方式:将它们转移到新frame的顶部、底部或保留原始位置。 |
描述性统计量:
argmax() | 找出最大值首次出现的索引位置(针对series) |
---|---|
idxmax() | 找出最大值首次出现的索引位置(针对frame) |
cumsum() | 累积和 |
cumprod() | 累计乘积 |
cummin() | 累积最小值 |
cummax() | 累积最大值 |
diff() | 计算连续的列或Series项之间的滑动值 |
唯一性、计数、会员资格:
unique() | 计算不同值的组成的数组,并能给出每个不同值出现的次数。用在Series中 |
---|---|
value_counts() | 计算不同值的组成的数组,并能给出每个不同值出现的次数。用在frame中 |
isin() | 专门为Series和frame定义的。它返回一个与数据大小相同的布尔型的Series或frame,用于确定Series或frame的每一项是否存在于某个集合中。 |
第36单元 数据转换
数据聚合:
groupby()
通过一个或多个分类的键值将行分到不同的组中,从而实现对frame的分割。
聚合函数包括以下几种:
count() | 返回组中的行数 |
---|---|
sum() | 返回组中数字行的总和 |
mean() | 返回组中所有行相应的统计量度量 |
median() | 返回组中所有行相应的统计量度量 |
std() | 返回组中所有行相应的统计量度量 |
var() | 返回组中所有行相应的统计量度量(没错,这四个函数效果一模一样) |
min() | 返回组中最小的行 |
max() | 返回组中最大的行 |
prod() | 返回组中数字行的乘积 |
first() | 返回组中的第一行(用在frame中) |
last() | 返回组中的最后一行(用在frame中) |
离散化:
离散化是指将连续变量转化为离散(分类)变量,通常用于直方图和机器学习。
qcuts()
与cuts()类似,不同的是qucts()使用分位数而不是区间宽度进行分割。可以用它来计算分位数。
qet_dummies()
将数组、series或frame转换为与原始对象拥有相同索引的另一个frame,每个列对应一个虚拟变量。
映射:
map() 将任意的单参数函数应用于选中列中的每一个元素。(非常低效)
第37单元 掌握pandas的文件读写功能
Pandas支持:
- 自动索引和列名提取
- 数据类型推断、数据转换和缺失值的检测
- 日期时间解析
- 消除“不干净”的数据
- 数据分块
读取CSV和表格文件:
read_csv()
根据文件名或打开的文件句柄,从指定的CSV文件中读取一个frame。该函数具有近50个可选参数。
read_csv()函数中重要参数说明:
sep/delimiter | 列分隔符,可以接受正则表达式 |
---|---|
header | 作为列名的行号(如果有自己的行号,则传递None) |
index_col | 作为索引的列名(False表示默认数字索引) |
skiprows | 要跳过的文件头行号或行号列表 |
thousands | 表示大数时使用的千位分隔符 |
names | 列名列表 |
na_values | 用于处理缺失数据的字符串或字符串列表 |
(
"What you get is what you get.What you do with what you get, that's more the point."--《City of Ember 》
)