![52453ac5ef3115d03d164efef46920ae.png](https://img-blog.csdnimg.cn/img_convert/52453ac5ef3115d03d164efef46920ae.png)
本文是《利用Python进行数据分析》的第七章<数据规整化:清理、转化、合并、重塑>的学习笔记。
![c1b75a0edd078a8a96ec31cbe1633539.png](https://img-blog.csdnimg.cn/img_convert/c1b75a0edd078a8a96ec31cbe1633539.png)
一、合并数据集
1.1数据库风格的DataFrame合并
数据集的合并(merge)或连接(join)运算是通过一个或多个键将行链接起来的。这些运算是关系型数据库的核心,与SQL语言类似。pandas的merge函数是对数据应用这些算法的主要切入点。
先以一个简单的案例开始,如果没有指明要用哪个列进行连接,merge就会将重叠列的列名当做键,最好使用on显式指定一下。
![bbf8d81918ce461730f2d7209505ed0f.png](https://img-blog.csdnimg.cn/img_convert/bbf8d81918ce461730f2d7209505ed0f.png)
![ce87841cd8a7dc0d51abbfd187051391.png](https://img-blog.csdnimg.cn/img_convert/ce87841cd8a7dc0d51abbfd187051391.png)
默认merge做的是inner连接,结果是交集。此外还有left、right、outer连接,外连接求取的是键的并集。多对多连接产生的是行的笛卡尔积。
![6a8d8c3390e6d45570369e540ba0b01e.png](https://img-blog.csdnimg.cn/img_convert/6a8d8c3390e6d45570369e540ba0b01e.png)
![9a43cb8f06d21bcabec6a1eea2d317f5.png](https://img-blog.csdnimg.cn/img_convert/9a43cb8f06d21bcabec6a1eea2d317f5.png)
![8c7032e50340da4afc6fa127d8d98b4c.png](https://img-blog.csdnimg.cn/img_convert/8c7032e50340da4afc6fa127d8d98b4c.png)
要根据多个键进行合并,传入一个由列名组成的列表即可:
![e162f36817745dde18318e8df345d807.png](https://img-blog.csdnimg.cn/img_convert/e162f36817745dde18318e8df345d807.png)
![6cca99b95d652e2e165f7af4dfd0ac78.png](https://img-blog.csdnimg.cn/img_convert/6cca99b95d652e2e165f7af4dfd0ac78.png)
1.2索引上的合并
有时,DataFrame中的连接键位于其索引中。在这种情况下,你可以传入left_index=True或right_index=True(或两个都传)以说明索引应该被用作连接键。
![3a343e4a38f5822c4f5a86e3eb5a4299.png](https://img-blog.csdnimg.cn/img_convert/3a343e4a38f5822c4f5a86e3eb5a4299.png)
![1a52c9f6fd5e46bc8cf024191a31b057.png](https://img-blog.csdnimg.cn/img_convert/1a52c9f6fd5e46bc8cf024191a31b057.png)
对于层次化索引,必须以列表的形式指明用作合并键的多个列。
![9bdab8dffc941e71a344ac21784d5318.png](https://img-blog.csdnimg.cn/img_convert/9bdab8dffc941e71a344ac21784d5318.png)
![b7c5ccf80ee43058fa7cf6bb6a3f2f57.png](https://img-blog.csdnimg.cn/img_convert/b7c5ccf80ee43058fa7cf6bb6a3f2f57.png)
DataFrame还有一个join实例方法,它能更为方便地实现按索引合并。
![83f7c72707da28143c0874904eaef54a.png](https://img-blog.csdnimg.cn/img_convert/83f7c72707da28143c0874904eaef54a.png)
对于简单的索引合并,还可以向join传入一组DataFrame
![fe08c854c17c0b7816d48fe1cb51a30f.png](https://img-blog.csdnimg.cn/img_convert/fe08c854c17c0b7816d48fe1cb51a30f.png)
1.3轴向合并
另一种数据合并运算也被称为连接(concatenation)、绑定(binding)或堆叠(stacking)。NumPy有一个用于合并原始NumPy数组的concatenation函数:
![9dce705cf0e1d34962f6867eedf01071.png](https://img-blog.csdnimg.cn/img_convert/9dce705cf0e1d34962f6867eedf01071.png)
假设有三个没有重叠索引的Series,对这些对象调用concat可以将值和索引粘合在一起。
![7f58acd430e0b0f6bd696469301a2f12.png](https://img-blog.csdnimg.cn/img_convert/7f58acd430e0b0f6bd696469301a2f12.png)
默认是在axis=0上工作的,也可以在axis=1上工作。
![9381312e51ddef9de1d8bc35502c0783.png](https://img-blog.csdnimg.cn/img_convert/9381312e51ddef9de1d8bc35502c0783.png)
同样的逻辑对于DataFrame对象也是一样的
![1a072eb8e416ac398afbbc10dd2d9b83.png](https://img-blog.csdnimg.cn/img_convert/1a072eb8e416ac398afbbc10dd2d9b83.png)
![64e3f78aecdf204391a999cf455beaf5.png](https://img-blog.csdnimg.cn/img_convert/64e3f78aecdf204391a999cf455beaf5.png)
1.4合并重叠数据
使用Numpy的where函数,它用于表达一种矢量化的if-else
![c92065840d6045ebb00b3cd727cd643d.png](https://img-blog.csdnimg.cn/img_convert/c92065840d6045ebb00b3cd727cd643d.png)
![b060a2c85c03d8933d8058c7c000a803.png](https://img-blog.csdnimg.cn/img_convert/b060a2c85c03d8933d8058c7c000a803.png)
Series有一个combine_first方法,实现的也是一样的功能,而且会进行数据对齐。
![48ca0ff8caf7948628860923ebe678a3.png](https://img-blog.csdnimg.cn/img_convert/48ca0ff8caf7948628860923ebe678a3.png)
对于DataFrame,combine_first会做同样的事,用参数对象中的数据为调用者对象的缺失数据“打补丁”。
![6e1d0270d9148f999ae70b6d5fad3e46.png](https://img-blog.csdnimg.cn/img_convert/6e1d0270d9148f999ae70b6d5fad3e46.png)
![0a855c71042372a949ba00c1cd7a9e79.png](https://img-blog.csdnimg.cn/img_convert/0a855c71042372a949ba00c1cd7a9e79.png)
二、重塑和轴向旋转
有许多用于重新排列表格型数据的基础运算。这些函数也被称作重塑(reshape)或轴向旋转(pivot)运算。
2.1重塑层次化索引
使用stack将数据的列“旋转”为行,unstack是它的逆运算,将数据的行旋转为列。
![22e94376041316ae1f948d5c6215ee71.png](https://img-blog.csdnimg.cn/img_convert/22e94376041316ae1f948d5c6215ee71.png)
![4602a2348c6a8305528e0b74d9ee93de.png](https://img-blog.csdnimg.cn/img_convert/4602a2348c6a8305528e0b74d9ee93de.png)
2.2将“长格式”旋转为“宽格式”
DataFrame的pivot方法可以实现这个转换
三、数据转换
上面介绍的都是数据的重排,另一重要操作是过滤、清理及其他转换工作。
3.1移除重复数据
DataFrame的duplicated方法返回一个布尔型Series,表示各行是否是重复行。使用drop_duplicates()方法去除重复值。
![ea1c3ada493b7107c82920b34d3f8cef.png](https://img-blog.csdnimg.cn/img_convert/ea1c3ada493b7107c82920b34d3f8cef.png)
![4ed3a7976bf6847ad90e53f5a253c00b.png](https://img-blog.csdnimg.cn/img_convert/4ed3a7976bf6847ad90e53f5a253c00b.png)
上述方法默认会判断全部列,也可以指定部分列进行重复项判断。
![da8d477f307983162bb0d3f9bb52c690.png](https://img-blog.csdnimg.cn/img_convert/da8d477f307983162bb0d3f9bb52c690.png)
3.2利用函数或映射进行数据转换
Series的map方法可以接受一个函数或含有映射关系的字典型对象。
![45a0c1c16ff47968a31f0ee181e5b008.png](https://img-blog.csdnimg.cn/img_convert/45a0c1c16ff47968a31f0ee181e5b008.png)
![bf7ead8613f00dc238de16f3d28da4a5.png](https://img-blog.csdnimg.cn/img_convert/bf7ead8613f00dc238de16f3d28da4a5.png)
我们也可以传入一个能够完成全部这些工作的函数
![40c24d8bf7bbc82f4312081dc97702e3.png](https://img-blog.csdnimg.cn/img_convert/40c24d8bf7bbc82f4312081dc97702e3.png)
3.3替换值
使用replace方法进行替换
![b3cf2affaa99ea226bc1f76e02a132a0.png](https://img-blog.csdnimg.cn/img_convert/b3cf2affaa99ea226bc1f76e02a132a0.png)
如果希望一次性替换多个值,可以传入一个由待替换值组成的列表以及一个替换值;如果希望对不同的值进行不同的替换,则传入一个由替换关系组成的列表;传入的参数也可以是字典。
![4354bdbdaa46aba57f6e22743dbefa15.png](https://img-blog.csdnimg.cn/img_convert/4354bdbdaa46aba57f6e22743dbefa15.png)
3.4重命名轴索引
跟Series中的值一样,轴标签也可以通过函数或映射进行转换,从而得到一个新对象。如使用轴标签的map方法
![fc19898cbe5576b7be068a062739f96c.png](https://img-blog.csdnimg.cn/img_convert/fc19898cbe5576b7be068a062739f96c.png)
还可以使用rename方法
![0895a93df273e7927531e0e7052dc0f8.png](https://img-blog.csdnimg.cn/img_convert/0895a93df273e7927531e0e7052dc0f8.png)
![5d16d5d2882077a3d5c399a5a04b0629.png](https://img-blog.csdnimg.cn/img_convert/5d16d5d2882077a3d5c399a5a04b0629.png)
3.5离散化和面元划分
为了便于分析,连续数据常常被离散化或拆分为“面元”(bin),可以使用cat函数。
![c854696f218f6328b2164e102a1bb73f.png](https://img-blog.csdnimg.cn/img_convert/c854696f218f6328b2164e102a1bb73f.png)
cut有codes、categories、value_counts三个属性
![24782dac659a7846230ab00876babf42.png](https://img-blog.csdnimg.cn/img_convert/24782dac659a7846230ab00876babf42.png)
qcut可以根据样本分位数对数据进行面元划分
![b8dac9f0e4cca230173dd34d256dee68.png](https://img-blog.csdnimg.cn/img_convert/b8dac9f0e4cca230173dd34d256dee68.png)
3.6检测和过滤异常值
![3e41f93e2bf53d20b28a1e0fca570ea1.png](https://img-blog.csdnimg.cn/img_convert/3e41f93e2bf53d20b28a1e0fca570ea1.png)
3.7排列和随机采样
使用numpy.random.permutation函数可以对列的顺序重排
![e2dfbd5838b51a2c937014951e3da33e.png](https://img-blog.csdnimg.cn/img_convert/e2dfbd5838b51a2c937014951e3da33e.png)