数据规整中的聚合、合并和重塑(数据分析)

108 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

1.层次化索引

什么是层次化索引?

层次化索引(hierarchical indexing) 是pandas的一项重要功能, 它使你能在一个轴上拥有多个
(两个以上) 索引级别。 抽象点说, 它使你能以低维度形式处理高维度数据。

image.png

import pandas as pd
import numpy as np
data=pd.Series(np.random.randn(9),index=[['a','a','a','b','b','c','c','d','d'],[1,2,3,1,3,1,2,2,3]])
data

我们这里看到的结果就是经过梅花的带有索引的Series的格式。当然,对于一个层次化索引的对象,我们可以使用所谓的部分索引,可以更便捷的选取数据子集。

image.png

data['a']

这些功能就让层次化索引在数据重塑和基于分组的操作中扮演着重要的角色。就比如我们可以使用一个unstack方法将这段数据重新安排到一个DataFrame中。

image.png

data.unstack()

2.重排与分级排序

在有些时候,我们需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象,注意一点!数据不会发生变化。

image.png

frame=pd.DataFrame(np.arange(12).reshape((4,3)),index=[['a','a','b','b'],[1,2,1,2]],columns=[['ohio','ohio','colorado'],['Green','red','green']])
frame.index.names=['key1','key2']
frame.columns.names=['state','color']
frame.swaplevel('key1','key2')

而sort_index则根据单个级别中的值对数据进行排序。 交换级别时,常常也会用到sort_index, 这
样最终结果就是按照指定顺序进行字母排序了:

image.png

frame.sort_index(level=1)

3.根据级别汇总统计

许多对DataFrame和Series的描述和汇总统计都有一个level选项, 它用于指定在某条轴上求和的级
别。 再以上面那个DataFrame为例, 我们可以根据行或列上的级别来进行求和:

image.png

frame.sum(level='key2')

4.合并数据集

pandas对象中的数据可以通过一些方式进行合并:

  • pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。 SQL或其他关系型数
    据库的用户对此应该会比较熟悉, 因为它实现的就是数据库的join操作。
  • pandas.concat可以沿着一条轴将多个对象堆叠到一起。
  • 实例方法combine_first可以将重复数据拼接在一起, 用一个对象中的值填充另一个对象中的缺
    失值。

4.1数据库风格的DataFrame合并

数据集的合并(merge) 或连接(join) 运算是通过一个或多个键将行连接起来的。 这些运算是关
系型数据库(基于SQL) 的核心。 pandas的merge函数是对数据应用这些算法的主要切入点。

image.png

df1=pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
df2=pd.DataFrame({'key':['a','b','d'],'data2':range(3)})
df1

5.合并重叠数据

还有一种数据组合问题不能用简单的合并(merge) 或连接(concatenation) 运算来处理。 比如
说, 你可能有索引全部或部分重叠的两个数据集。 举个有启发性的例子, 我们使用NumPy的where
函数, 它表示一种等价于面向数组的if-else:

image.png

a=pd.Series([np.nan,2.5,np.nan,3.5,4.5,np.nan],index=['f','e','d','c','b','a'])
b=pd.Series(np.arange(len(a),dtype=np.float64),index=['f','e','d','c','b','a'])
b[-1]=np.nan
a