数据规整:聚合、合并和重塑 《利用pandas进行数据分析-e2》
数据可能分散在许多文件或数据库中,存储的形式也不利于分析。
本章关注可以聚合、合并、重塑数据的方法。
- 首先,我会介绍pandas的层次化索引,它广泛用于以上操作。
- 然后,我深入介绍了 一些特殊的数据操作。merge , concat方法。
- 最后,实战应用:在第14章,你可以看到这些工具的多种应用。
8.1 层次化索引
层次化索引在数据重塑和基于分组的操作(如透视表生成)中扮演着重要的角色。
data = pd.Series(np.random.randn(9), index=[list("aaabbccdd"),[1,2,3,1,3,1,2,2,3]]) # a 1 -0.081004 2 0.849981 3 -0.140836 b 1 1.347778 3 -0.187549 c 1 1.072571 2 -1.201107 d 2 -0.605826 3 -0.542657 dtype: float64
#可以这么用,先用level0的索引进行切片提取数据,然后用level1的索引提取数据 data.loc[:, 2]
#a 0.849981 #c -1.201107 #d -0.605826 #dtype: float64
data.unstack() 和stack():
一对方法,分别是分解level1索引到columns,和把columns变成level1的index.
横轴和纵轴都可以有多重索引:
可以给行和列索引定义名字: frame.columns.names = ['state', 'color']
⚠️DataFrame结构数据 , 这种索引 frame["xxx"] , 方括号内的是列名。Series结构是一维的,所以frame["xxx"]的xxx本质也是列名。
pd.MultiIndex.from_arrays()
单独设置多重索引,以便反复使用。用法见:https://www.cnblogs.com/chentianwei/p/12267929.html
重排与分级排序:
- swaplevel(i, j) :重排列index, 把level的位置交换。
- sort_index(): 根据某个level进行排序
根据level进行汇总sum()统计:
frame.sum(level="key2") frame.sum(level="color", axis=1)
⚠️其实是使用了groupby,先分组,然后再统计。
使用DataFrame的列进行索引: set_index(keys),就是用自己的列数据当"行"索引。
例子
frame = pd.DataFrame({'a': range(7), 'b': range(7,0,-1), 'c':['one']*3+['two']*4, 'd':[0,1,2,0,1,2,3]})
frame.set_index(["c", 'd'])
set_index()后 还可以反向操作:reset_index()
8.2 合并数据集
数据库风格的DataFrame合并
数据集的合并(merge)或连接(join)运算是通过一个或多个键将行连接起来的。 这些运算是关系型数据库(基于SQL)的核心。
pd.merge(left, right, how="inner", left_on=None, right_on=None, left_index=False, right_index=False)
之前的博客的例子:https://www.cnblogs.com/chentianwei/p/12302654.html
索引上的合并
有时候,DataFrame中的连接键位于其索引中。
在这种情况下,可以传入 left_index=True或right_index=True(或两个都传)以说明索引应该被用作连接键:
left1 = pd.DataFrame({'key': ['a', 'b', 'a', 'a', 'b','c'],'value': range(6)}) right1 = pd.DataFrame({'group_val': [3.5, 7]}, index=['a', 'b']) pd.merge(left1, right1, left_on='key', right_index=True) key value group_val 0 a 0 3.5 2 a 2 3.5 3 a 3 3.5 1 b 1 7.0 4 b 4 7.0
轴向连接:连接(concatenation)、绑定(binding)或堆叠 (stacking)。
合并重叠数据
8.3 重塑和轴向旋转
重塑层次化索引
将“长格式”旋转为“宽格式”