在很多应用中,数据可能分布在多个文件或数据库中,亦或以某种不易于分析的格式进行排列,需要对数据进行联合、连接以及重新排列等操作。
分层索引
分层索引允许你在一个轴向上拥有多个索引层级。笼统地说,分层索引提供了一种在更低维度的形式中处理更高维度数据的方式
1 | import numpy as np |
分层索引可以使用stack函数和unstack函数实现数据重塑,即完成具有层次索引的Series和DataFrame之间的转换,具体可参考后面数据重塑部分的介绍。
在DataFrame中,每个轴也都可以拥有分层索引
1 | import numpy as np |
重排序和层级排序
有时需要重新排列轴上的层级顺序,或者按照特定层级的值对数据进行排序,可以使用swaplevel
接收两个层级序号或层级名称,返回一个进行了层级变更的对象;而sort_index
只能在单一层级上对数据进行排序。
1 | import numpy as np |
索引按照字典顺序从最外层开始排序是,数据选择性能和数据可读性会更好。
按层级进行汇总统计
DataFrame和Series中很多描述型和统计型函数有一个level
选项可以指定想要在某个特定的轴上进行聚合。
1 | import numpy as np |
使用DataFrame的列进行索引
有时候需要将某些列作为索引可以通过set_index
函数实现。reset_index
是它的反函数,可以将分层索引的索引移动到列中。
1 | import numpy as np |
联合与合并数据集
包含pandas对象的数据可以通过多种方式联合在一起:
pd.merge
根据一个或多个键进行连接pd.concat
使对象在轴向上进行黏合或堆叠combine_first
实例方法允许将重叠的数据拼接在一起,以使用一个对象中的值填充另一个对象中的缺失值
数据库风格连接
其中pd.merge
实现的是数据库的连接操作,用于将各种join
操作算法运用到你的数据上
1 | import numpy as np |
merge函数参数如下:
参数 | 描述 |
---|---|
left | 合并时,左边的DataFrame数据 |
right | 合并时,右边的DataFrame数据 |
how | 连接方式:’inner’,’outer’,’left’,’right’之一,默认是’inner’ |
on | 连接键,必须是两边DataFrame都有的列名 |
left_on | left DataFrame中用作连接键的列 |
right_on | right DataFrame中用作连接键的列 |
left_index | 使用left的行索引作为它的连接键 |
right_index | 使用right的行索引作为它的连接键 |
sort | 通过连接键按字母顺序合并的数据进行排序,默认为True |
suffixes | 添加到列名后到字符串元组,默认是’_x’ , ‘_y’ |
copy | 如果是False,在某些特殊情况下避免将数据复制到结果数据结构中,默认情况是复制的 |
indicator | 添加一个特殊的列_merge ,指示每一行的来源,值将根据每行中连接数据的来源分为’left_only’,’right_only’,’both’ |
根据索引合并
有时需要根据DataFrame的索引进行合并,可以传递left_index=True
或者right_index=True
,或者都传,来表示索引需要用来作为合并的键
1 | import numpy as np |
DataFrame有一个方便的join
实例方法,用于按照索引合并,也可以用于合并多个索引相同或相似但没有重叠列的DataFrame对象,上面的数据合并也可以这样写:
1 | import numpy as np |
对于一些简单的索引-索引合并,也可以向join
方法中转入一个DataFrame列表,进行多对象合并。
沿轴向连接
另一种数据组合操作可称为拼接、绑定或堆叠。np.concatenate
函数可以在Numpy数组上实现该功能:
1 | import numpy as np |
pandas的concat
函数提供了实现将值和索引粘在一起的功能,先来看看concat
在Series中的表现:
1 | import numpy as np |
相同的逻辑应用到DataFrame的连接中:
1 | import numpy as np |
concat函数的参数
参数 | 描述 |
---|---|
objs | 需要连接的pandas对象列表或字典 |
axis | 连接的轴向,默认是0,即行方向 |
join | 默认是’outer’,用于指定连接方式 |
join_axes | 用于指定其他轴的特定索引 |
keys | 与要连接的对象关联的值,形成层级索引 |
levels | 在键值传递时,指定多层索引的层级 |
names | 用于指定多层索引的层级名称 |
verify_integrity | 检查连接对象中新的轴是否重复,默认是False,允许重复 |
ignore_index | 不沿着连接轴保留索引,生成新的索引 |
联合重叠数据
当你有两个数据集,它们的索引全部或部分重叠,你需要用根据轴向索引,用其中一个数据集的值填充或替换另一个数据集的值
1 | import numpy as np |
重塑和透视
重排列表格型数据有多种基础操作,比如重塑或透视。
使用多层索引进行重塑
多层索引在DataFrame中提供了一种一致性方式用于重排列数据:
- stack(堆叠):将列中的数据透视到行,即DataFrame变为多重索引的Series,行标签即外层索引
- unstack(拆堆):将行中的数据透视到列,即多重索引的Series变为DataFrame,内层索引变为列标签
1 | import numpy as np |
将长透视为宽
将一列变换成DataFrame中的多列,需要掌握pivot
函数的用法
1 | import numpy as np |
将宽透视为长
np.melt
是pivot
方法的反函数,它将多列合并成一列,产生一个新的DataFrame:
1 | import numpy as np |
数据分组和聚合
数据分组需要掌握groupby
函数
1 | import numpy as np |