笔记:利用Python进行数据分析 第7章

数据规整化:清理、转换、合并、重塑

7.1 合并数据集

内置方式:
pandas.merge 可根据一个或多个键将不同DataFrame中的行连接起来。
pandas.concat 可以沿着一条轴将多个对象堆叠到一起。
实例方法combine_first 可以将重复数据编接在一起,用一个对象中的值填充另一个对象中的缺失值。

7.1.1 数据库风格的DataFrame合并

多对一的合并

笔记:利用Python进行数据分析 第7章
笔记:利用Python进行数据分析 第7章
如果两个对象的列名不同,可以分别进行指定:
笔记:利用Python进行数据分析 第7章
默认情况下,merge做的是"inner"连接;结果中的键是交集。
其他方式还有"left"、“right"以及"outer”。

外连接求取的是键的并集,组合了左连接和右连接的效果:
笔记:利用Python进行数据分析 第7章

多对多的合并

笔记:利用Python进行数据分析 第7章
多对多连接产生的是行的笛卡尔积。连接方式只影响出现在结果中的键。

多个键的合并

传入一个由列名组成的列表即可:
笔记:利用Python进行数据分析 第7章
笔记:利用Python进行数据分析 第7章
结果中会出现哪些键组合取决于所选的合并方式。
警告: 在进行列-列连接时,DataFrame对象中的索引会被丢弃。

重复列名的处理

merge有个实用的suffixes选项,用于指定附加到左右两个DataFrame对象的重叠列名上的字符串:
笔记:利用Python进行数据分析 第7章

merge的参数

笔记:利用Python进行数据分析 第7章

7.1.2 索引上的合并

有时候,DataFrame中的连接键位于其索引中。在这种情况下,可以传入left_index=True或right_index=True(或两个都传)以说明索引应该被用作连接键:
笔记:利用Python进行数据分析 第7章

层次化索引的合并

必须以列表的形式指明用作合并键的多个列(注意对重复索引值的处理):
笔记:利用Python进行数据分析 第7章

合并双方的索引

笔记:利用Python进行数据分析 第7章

join实例方法

更为方便地实现按索引合并。还可用于合并多个带有相同或相似索引的DataFrame对象,而不管它们之间有没有重叠的列:
笔记:利用Python进行数据分析 第7章
支持参数DataFrame的索引跟调用者DataFrame的某个列之间的连接:
笔记:利用Python进行数据分析 第7章
对于简单的索引合并,还可以向join传入一组DataFrame:
笔记:利用Python进行数据分析 第7章

7.1.3 轴向连接

另一种数据合并运算也被称作连接(concatenation)、绑定(binding)或堆叠(stacking)。

NumPy有一个用于合并原始NumPy数组的concatenation函数:
笔记:利用Python进行数据分析 第7章
对于pandas对象(如Series和DataFrame),带有标签的轴能够进一步推广数组的连接运算。pandas的concat函数提供了这种方式,调用concat可以将值和索引粘合在一起:
笔记:利用Python进行数据分析 第7章
默认情况下,concat是在axis=0上工作的。

传入join='inner’可得到交集:
笔记:利用Python进行数据分析 第7章
可以通过join_axes指定要在其他轴上使用的索引:
笔记:利用Python进行数据分析 第7章
使用keys参数即可在连接轴上创建一个层次化索引:
笔记:利用Python进行数据分析 第7章
沿着axis=1对Series进行合并,keys就会成为DataFrame的列头:
笔记:利用Python进行数据分析 第7章
同样的逻辑对DataFrame对象也是一样:
笔记:利用Python进行数据分析 第7章
如果传入的不是列表而是一个字典,则字典的键就会被当做keys选项的值:
笔记:利用Python进行数据分析 第7章
跟当前分析工作无关的DataFrame行索引,传入ignore_index=True即可:
笔记:利用Python进行数据分析 第7章
两个用于管理层次化索引创建方式的参数:
笔记:利用Python进行数据分析 第7章

Concat函数的参数

笔记:利用Python进行数据分析 第7章

7.1.4 合并重叠数据

还有一种数据组合问题不能用简单的合并(merge)或连接(concatenation)运算来处理。比如说,你可能有索引全部或部分重叠的两个数据集。

combine_first方法:根据传入的对象来“修补”调用对象的缺失值
笔记:利用Python进行数据分析 第7章
DataFrame同理:
笔记:利用Python进行数据分析 第7章

7.2 重塑和轴向旋转

有许多用于重新排列表格型数据的基础运算。这些函数也称作重塑(reshape)或轴向旋转(pivot)运算。

7.2.1 重塑层次化索引

层次化索引为DataFrame数据的重排任务提供了一种具有良好一致性的方式。主要功能有二:

  • stack:将数据的列“旋转”为行。
  • unstack:将数据的行“旋转”为列。
    笔记:利用Python进行数据分析 第7章

默认情况下,unstack操作的是最内层(stack也是如此)。
传入分层级别的编号或名称即可对其他级别进行unstack操作,stack同样可用此操作:
笔记:利用Python进行数据分析 第7章
如果不是所有的级别值都能在各分组中找到的话,则unstack操作可能会引入缺失数据:
笔记:利用Python进行数据分析 第7章
stack默认会滤除缺失数据,因此该运算是可逆的:
笔记:利用Python进行数据分析 第7章
在对DataFrame进行unstack操作时,作为旋转轴的级别将会成为结果中的最低级别:
笔记:利用Python进行数据分析 第7章

7.2.2 将“长格式”旋转为“宽格式”

时间序列数据通常是以所谓的“长格式”(long)或“堆叠格式”(stacked)存储在数据库和CSV中的。

pivot方法

笔记:利用Python进行数据分析 第7章
假设有两个需要参与重塑的数列,如果忽略最后一个参数,得到的DataFrame就会带有层次化的列:
笔记:利用Python进行数据分析 第7章
注意,pivot其实只是一个快捷方式而已:用set_index创建层次化索引,再用unstack重塑:
笔记:利用Python进行数据分析 第7章

7.3 数据转换

7.3.1 移除重复数据

DataFrame的duplicated方法返回一个布尔型Series,表示各行是否存在重复情况。还有drop_duplicates方法返回一个移除了重复行的Data-Frame。
笔记:利用Python进行数据分析 第7章
可以指定部分列进行重复项判断
笔记:利用Python进行数据分析 第7章
duplicated和drop_duplicates默认保留的是第一个出现的值组合。传入keep='last’则保留最后一个:
笔记:利用Python进行数据分析 第7章

7.3.2 利用函数或映射进行数据转换

使用map是一种实现元素级转换以及其他数据清理工作的便捷方式。
Series的map方法可以接受一个函数或含有映射关系的字典型对象:
笔记:利用Python进行数据分析 第7章
笔记:利用Python进行数据分析 第7章

7.3.3 替换值

利用fillna方法填充缺失数据可以看做值替换的一种特殊情况。
replace可用于修改对象的数据子集:
笔记:利用Python进行数据分析 第7章

7.3.4 重命名索引

轴标签也可以通过函数或映射进行转换,从而得到一个新对象。
轴还可以被就地修改,而无需新建一个数据结构。
笔记:利用Python进行数据分析 第7章
如果想要创建数据集的转换版(而不是修改原始数据),比较实用的方法是rename
笔记:利用Python进行数据分析 第7章
rename可以结合字典型对象实现对部分轴标签的更新:
笔记:利用Python进行数据分析 第7章
rename帮我们实现了:复制DataFrame并对其索引和列标签进行赋值。

如果希望修改原有数据集,传入inplace=True即可:
笔记:利用Python进行数据分析 第7章

7.3.5 离散化和面元划分

为了便于分析,连续数据常常被离散化或拆分为“面元”(bin)。
cut和qcut,这两个离散化函数对分量和分组分析非常重要。

pandas的cut函数

笔记:利用Python进行数据分析 第7章
跟“区间”的数学符号一样,圆括号表示开端,而方括号则表示闭端(包括)。哪边是闭端可以通过right=False进行修改:
笔记:利用Python进行数据分析 第7章
可以通过labels选项传递为一个列表或数组来自定义面元名称:
笔记:利用Python进行数据分析 第7章
如果向cut传入的是面元的数量而不是确切的面元边界,则它会根据数据的最小值和最大值计算等长面元:
笔记:利用Python进行数据分析 第7章

pandas的qcut函数

qcut是一个非常类似于cut的函数,它可以根据样本分位数对数据进行面元划分。cut可能无法使各个面元中含有相同数量的数据点。而qcut由于使用的是样本分位数,因此可以得到数量基本相等的面元:
笔记:利用Python进行数据分析 第7章
跟cut一样,也可以设置自定义的分位数(0到1之间的数值,包含端点):
笔记:利用Python进行数据分析 第7章

7.3.6 检测和过滤异常值

异常值的过滤或变换运算在很大程度上其实就是数组运算。
笔记:利用Python进行数据分析 第7章
笔记:利用Python进行数据分析 第7章
笔记:利用Python进行数据分析 第7章
笔记:利用Python进行数据分析 第7章

7.3.7 排列和随机采样

使用numpy.random.permutation函数可以轻松实现对DataFrame中的Series或行进行置(随机重排序)。

通过调用permutation可以根据需要的轴长度产生一个表示新顺序的整数数组:
笔记:利用Python进行数据分析 第7章

如果不想用替换的方式选取随机子集,可以使用sample方法:
笔记:利用Python进行数据分析 第7章
通过替换方式产生样本(允许有重复选择),replace=True传入sample方法:
笔记:利用Python进行数据分析 第7章

7.3.8 计算指标/哑变量

另一种常用于统计建模或机器学习的转换方式是:将分类变量(categorical variable)转换为“哑变量矩阵”(dummy matrix)或“指标矩阵”(indicator matrix)。

如果DataFrame的某一列中含有k个不同的值,则可以派生出一个k列矩阵或DataFrame(其值全为1和0)。

pandas有一个get_dummies函数可以实现该功能:
笔记:利用Python进行数据分析 第7章
如果DataFrame中的某行同属于多个分类,则事情就会有点复杂:
笔记:利用Python进行数据分析 第7章
对于更大的数据,用这种方式构建多成员指标变量就会变得非常慢。更好的方法是写一个直接将数据写为NumPy数组的底层函数,然后将结果封装进DataFrame。

将get_dummies和cut等离散化函数结合使用是统计应用的一个有用方法:
笔记:利用Python进行数据分析 第7章

7.4 字符串操作

pandas使你能够对整组数据应用字符串表达式和正则表达式,而且能处理烦人的缺失数据。

7.4.1 字符串对象方法

split方法拆分:
笔记:利用Python进行数据分析 第7章
split常常结合strip(用于修剪空白符(包括换行符))一起使用:
笔记:利用Python进行数据分析 第7章
连接字符串:
笔记:利用Python进行数据分析 第7章
定位子字符串:
笔记:利用Python进行数据分析 第7章
count函数,可以返回指定子字符串的出现次数:
笔记:利用Python进行数据分析 第7章
replace将用一种模式替换为另一个模式。也常用于传入空字符串来用于删除某个模式:
笔记:利用Python进行数据分析 第7章

Python内置的字符串方法

笔记:利用Python进行数据分析 第7章

7.4.2 正则表达式

正则表达式(通常称作regex)提供了一种灵活的在文本中搜索或匹配字符串模式的方式。正则表达式是根据正则表达式语言编写的字符串。Python内置的re模块负责对字符串应用正则表达式。

re模块的函数可以分为三个大类:模式匹配、替换、拆分。一个regex描述了需要在文本中定位的一个模式,可以用于许多目的。

拆分一个含多种空白字符(制表符、空格、换行符等)的字符串。描述一个或多个空白符的regex是\s+:
笔记:利用Python进行数据分析 第7章
可以用re.compile自行编译regex以得到一个可重用的regex对象:
笔记:利用Python进行数据分析 第7章
希望获得所有匹配regex的模式的列表,则可以使用findall方法:
笔记:利用Python进行数据分析 第7章
注意: 如果想避免正则表达式中不需要的转义(\),则可以使用原始字符串字面量如r’C:\x’(也可以编写其等价式’C:\x’)。

如果打算对许多字符串应用同一条正则表达式,强烈建议通过re.compile创建regex对象。这样将可以节省大量的CPU时间。
笔记:利用Python进行数据分析 第7章
findall返回的是字符串中所有的匹配项,而search则只返回第一个匹配项。match更加严格,它只匹配字符串的首部。sub方法,会将匹配到的模式替换为指定字符串,并返回所得到的新字符串:
笔记:利用Python进行数据分析 第7章
笔记:利用Python进行数据分析 第7章
笔记:利用Python进行数据分析 第7章
笔记:利用Python进行数据分析 第7章

匹配项分组

要实现分组功能,只需将待分段的模式的各部分用圆括号包起来即可:
笔记:利用Python进行数据分析 第7章
ub还能通过诸如\1、\2之类的特殊符号访问各匹配项中的分组。\1表示第一个匹配分组,\2表示第二个匹配分组,以此类推:
笔记:利用Python进行数据分析 第7章

正则表达式方法

笔记:利用Python进行数据分析 第7章

7.4.3 Pandas中矢量化的字符串函数

清理待分析的散乱数据时,常常需要做一些字符串规整化工作。更为复杂的情况是,含有字符串的列有时还含有缺失数据:
笔记:利用Python进行数据分析 第7章
通过data.map,所有字符串和正则表达式方法都能被应用于(传入lambda表达式或其他函数)各个值,但是如果存在NA就会报错。
为了解决这个问题,Series有一些能够跳过NA值的字符串操作方法。
通过Series的str属性即可访问这些方法。
笔记:利用Python进行数据分析 第7章
这里也可以使用正则表达式,还可以加上任意re选项(如IGNORECASE):
笔记:利用Python进行数据分析 第7章
有多种方法可以进行向量化的元素检索。可以使用str.get或在str属性内部索引:
笔记:利用Python进行数据分析 第7章
可以使用字符串切片的类似于法进行向量化切片:
笔记:利用Python进行数据分析 第7章

部分向量化字符串方法列表

笔记:利用Python进行数据分析 第7章

示例:usda食品数据库

示例:usda食品数据库