在许多应用中,数据可能分散在许多文件或数据库中,存储的形式也不利于分析,应采用聚合、合并、重塑数据的方法进行处理。
层次化索引
层次化索引(hierarchical indexing)是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别。
![](https://img.haomeiwen.com/i13183583/1b0b845cef70a748.png)
![](https://img.haomeiwen.com/i13183583/58c2fd28e1bf2d6f.png)
“内层”中进行选取
![](https://img.haomeiwen.com/i13183583/10731520cd112ce9.png)
unstack的逆运算是stack
![](https://img.haomeiwen.com/i13183583/eda2c24d506910c9.png)
对于一个DataFrame,每条轴都可以有分层索引
![](https://img.haomeiwen.com/i13183583/a170cd3d3949cbd8.png)
有了部分列索引,因此可以轻松选取列分组
![](https://img.haomeiwen.com/i13183583/ec6dbd3b0926ed1e.png)
重排与分级排序
调整某条轴上各级别的顺序
![](https://img.haomeiwen.com/i13183583/46901deb09f83aaa.png)
而sort_index则根据单个级别中的值对数据进行排序。交换级别时,常常也会用到 sort_index,这样最终结果就是按照指定顺序进行字母排序了。
![](https://img.haomeiwen.com/i13183583/cd9a052e39b30f9d.png)
根据级别汇总统计
对DataFrame和Series的描述和汇总统计都有一个level选项,它用于指定在某条轴上求和的级别。
![](https://img.haomeiwen.com/i13183583/07e83dc3b989111b.png)
使用DataFrame的列进行索引
将DataFrame的一个或多个列当做行索引来用,或者可能希望将行索引变成DataFrame的列
![](https://img.haomeiwen.com/i13183583/9914414f37df7538.png)
默认情况下,那些列会从DataFrame中移除,但也可以将其保留下来(drop=False)
![](https://img.haomeiwen.com/i13183583/f7cb5c800f30be10.png)
reset_index的功能跟set_index刚好相反,层次化索引的级别会被转移到列里面
![](https://img.haomeiwen.com/i13183583/e90dbd623286f549.png)
合并数据集
pandas对象中的数据可以通过一些方式进行合并
pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。SQL或其他关系型数据库的用户对此应该会比较熟悉,因为它实现的就是数据库的join操作。
pandas.concat可以沿着一条轴将多个对象堆叠到一起。
实例方法combine_first可以将重复数据拼接在一起,用一个对象中的值填充另一个对象中的缺失值。
数据库风格的DataFrame合并
数据集的合并(merge)或连接(join)运算是通过一个或多个键将行连接起来的。
![](https://img.haomeiwen.com/i13183583/460545a0c8724f72.png)
这是一种多对一的合并
![](https://img.haomeiwen.com/i13183583/b9efa3981aca7b77.png)
没有指明要用哪个列进行连接。如果没有指定,merge就会将重叠列的列名当做键。最好明确指定一下。
![](https://img.haomeiwen.com/i13183583/b4605bd07207b240.png)
如果两个对象的列名不同,也可以分别进行指定。
![](https://img.haomeiwen.com/i13183583/0b8f8fdcb601d37e.png)
结果里面c和d以及与之相关的数据消失了。默认情况下,merge做的是“内连接”;结果中的键是交集。其他方式还有”left”、”right”以及”outer”。外连接求取的是键的并集,组合了左连接和右连接的效果。连接方式
![](https://img.haomeiwen.com/i13183583/dbe5b41b5b724a3f.png)
多表连接选项及说明
选项 | 说明 |
---|---|
inner | 使用两个表中共同拥有的键 |
left | 使用左表中所有的键 |
right | 使用右表中所有的键 |
outer | 使用两个表中所有的键 |
多对多的合并
![](https://img.haomeiwen.com/i13183583/291eec5cb49486ec.png)
多对多连接,由于左边的DataFrame有3个”b”行,右边的有2个,所以最终结果中就有6 个”b”。
![](https://img.haomeiwen.com/i13183583/4c722fb1ec9e2256.png)
根据多个键进行合并
![](https://img.haomeiwen.com/i13183583/8a851c5ade799ed1.png)
重复列名的处理
![](https://img.haomeiwen.com/i13183583/6d929f7d544b0430.png)
索引上的合并
连接键位于其索引中。在这种情况下,你可以传入left_index=True或right_index=True(或两个都传)以说明索引应该被用作连接键。
![](https://img.haomeiwen.com/i13183583/540ddb91f887d864.png)
层次化索引的数据, 索引的合并默认是多键合并
![](https://img.haomeiwen.com/i13183583/015620a88abb148c.png)
必须以列表的形式指明用作合并键的多个列(注意用how=‘outer’对重复索引值的处理)
![](https://img.haomeiwen.com/i13183583/62fd82b3504a8c37.png)
同时使用合并双方的索引
![](https://img.haomeiwen.com/i13183583/7f3539734672a0d0.png)
join实例方法,能实现按索引合并
![](https://img.haomeiwen.com/i13183583/b53e01b526a04965.png)
向join传入一组DataFrame
![](https://img.haomeiwen.com/i13183583/0b6b2ed4016f5d5e.png)
轴向连接
数据合并运算也被称作连接(concatenation)、绑定(binding)或堆叠(stacking)
![](https://img.haomeiwen.com/i13183583/7947ad0956e519a5.png)
pandas的concat函数合并操作
![](https://img.haomeiwen.com/i13183583/d0446db7ba1a78f2.png)
调用concat可以将值和索引粘合在一起
![](https://img.haomeiwen.com/i13183583/5d340f02adca1184.png)
传入axis=1,则结果就会变成一个DataFrame(axis=1是列)
![](https://img.haomeiwen.com/i13183583/e1ff778a5e174b61.png)
![](https://img.haomeiwen.com/i13183583/3f3d3929c5b424f1.png)
参与连接的片段在结果中区分不开。假设你想要在连接轴上创建一个层次化索引。使用keys参数即可达到这个目的。
![](https://img.haomeiwen.com/i13183583/5a903cb62ecb67bc.png)
如果沿着axis=1对Series进行合并,则keys就会成为DataFrame的列头。
![](https://img.haomeiwen.com/i13183583/8985039303d7af03.png)
![](https://img.haomeiwen.com/i13183583/981ec5eafe0b779c.png)
用names参数命名创建的轴级别
![](https://img.haomeiwen.com/i13183583/5931b916631cf920.png)
DataFrame的行索引不包含任何相关数据, 传入ignore_index=True
![](https://img.haomeiwen.com/i13183583/5d6f8c3e52c3e714.png)
合并重叠数据
索引全部或部分重叠的两个数据集
![](https://img.haomeiwen.com/i13183583/46cf2bd2948d5b1a.png)
此语句实现一样的功能
![](https://img.haomeiwen.com/i13183583/ff4f1eb32878ec96.png)
对于DataFrame,combine_first自然也会在列上做同样的事情,因此你可以将其看做:用传递对象中的数据为调用对象的缺失数据“打补丁”。
![](https://img.haomeiwen.com/i13183583/e9da8147d4d4068c.png)
重塑和轴向旋转
用于重新排列表格型数据的基础运算。这些函数也称作重塑(reshape)或轴向旋转(pivot) 运算。
重塑层次化索引
stack:将数据的列“旋转”为行u
nstack:将数据的行“旋转”为列
![](https://img.haomeiwen.com/i13183583/75f72b72387af0d3.png)
对该数据使用stack方法即可将列转换为行,得到一个Series。
![](https://img.haomeiwen.com/i13183583/654b25972209732b.png)
对于一个层次化索引的Series,你可以用unstack将其重排为一个DataFrame:
![](https://img.haomeiwen.com/i13183583/259e37ad884ef06d.png)
默认情况下,unstack操作的是最内层(stack也是如此)。传入分层级别的编号或名称即可对其它级别进行unstack操作。
![](https://img.haomeiwen.com/i13183583/c1765282f86c4b30.png)
将“长格式”旋转为“宽格式”
多个时间序列数据通常是以所谓的“长格式”(long)或“堆叠格式”(stacked)存储在数据库和CSV中的。我们先加载一些示例数据,做一些时间序列规整和数据清洗。
![](https://img.haomeiwen.com/i13183583/14ae87f7633eafaa.png)
不同的item值分别形成一列,date列中的时间戳则用作索引
![](https://img.haomeiwen.com/i13183583/90fea9f0d99b4f6a.png)
![](https://img.haomeiwen.com/i13183583/3971ffc90a637891.png)
如果忽略最后一个参数,得到的DataFrame就会带有层次化的列
![](https://img.haomeiwen.com/i13183583/ade784fcf0f8c9f9.png)
将“宽格式”旋转为“长格式”
![](https://img.haomeiwen.com/i13183583/ede894848f5c07fa.png)
当使用pandas.melt,我们必须指明哪些列是分组指标。下面使用key作为唯一的分组指标。
![](https://img.haomeiwen.com/i13183583/90dd0bf2ffcd3e85.png)
使用pivot,可以重塑回原来的样子
![](https://img.haomeiwen.com/i13183583/1743469fed011227.png)
因为pivot的结果从列创建了一个索引,用作行标签,我们可以使用reset_index将数据移回列
![](https://img.haomeiwen.com/i13183583/519e1565b0ae46fe.png)
指定列的子集,作为值的列
![](https://img.haomeiwen.com/i13183583/ad127a9c2e0e2078.png)
pandas.melt也可以不用分组指标
![](https://img.haomeiwen.com/i13183583/fe6e39ec701fe153.png)
网友评论