第8章 数据规整:聚合、合并和重塑
8.1 层次化索引
层次化索引就是在一个轴上有多个索引级别
层次化索引的索引对象是multiIndex
层次化对象可以很方便的进行部分索引
而对于DataFrame,1轴和0轴都可以用层次化索引
用df.index.names和df.columns.names可以给层次化索引进行命名,只需将名字的列表传入即可
重排与分级排序
swaplevel接受两个名称,可以让这调整这两个名称的顺序,注意调整保持原数据不变,且返回一个新对象
sort_index函数对单个级别中的值进行排序,传入level= x即可根据指定的x列中的值进行排序
根据级别汇总统计
df和ser都有level选项用于选定级别,以sum函数为例,可以传入level参数来根据级别进行求和
使用DataFrame的列进行索引
DataFrame的set_index函数可以将一个或多个列变成行索引,返回的是一个新对象
drop参数可以保存那些转变成行索引的列,
而reset_index可以将行的层次化索引转成列,是set_index函数的逆运算
注意,如果有列和行索引重叠,则此函数回报错(set_index选了drop = False后再使用reset_index会报错)
8.2 合并数据集
数据库风格的DataFrame合并
pandas的merge函数可以使得两个df进行合并
默认是将重叠的列作为连接键,不过最好还是指定一下,添加on = 'key'即可
如果没有重叠的列,也可以分别进行指定,且默认是内连接,相当于交集
如果指定how = 'outer'就相当于并集
注意多对多连接产生的是笛卡尔积,如左表中有3个'b',右表中有两个'b',则新表有6个'b'
如果要根据多个键进行合并,只需要将重叠的多个列名组成一个列表进行传递即可,此时原来的索引会被抛弃
如果合并的列中有的列的列名重复了,可以使用suffixes选项进行改名,即在原名后面加上后缀(只针对重复的列),默认是加上_x和_y
merge函数的参数:
索引上的合并
传入left_index = True和right_index = True即可对索引(行索引)进行合并
而对于层次化索引,层次化索引默认是多键合并,所以我们需要将多键的列名组成列表传入
当传入left_index = True和right_index = True时即可合并双方索引,DataFrame的join函数也可以实现相同的效果,但要求合并的对象双方没有重叠的列
join方法默认的是左连接,即保留左边的行索引
轴向连接
pandas的concat函数可以将不同对象进行轴向连接,默认情况下是在0轴上连接
默认情况下连接时并集连接,传入join = 'inner'即可实现交集连接
而join_axes指定在其他轴上使用的索引
如果想在轴上创建一个层次化索引,使用keys参数即可
如果指定轴为1,再传入keys参数则这些keys参数会变成DataFrame的列名
对于DataFrame也是如此,只不过将列索引变成层次化索引,而keys参数变成高层索引;如果传入的是一个字典,这时不需要keys选项,字典的键会变成高层索引
在进行0轴连接时,传入ignore_index = True即可忽略行索引信息
concat函数的参数:
合并重叠数据
DataFrame和Series的combine_first函数相当于打补丁,会根据索引自动对齐且自动补齐df或ser的索引对应处的缺失值
对于DataFrame:
8.3 重塑和轴向旋转
重塑层次化索引
对于一个DataFrame,stack函数是将数据的列转成行,而unstack函数是将行转成列,从而使列索引变成层次化索引
默认情况下,stack和unstack函数都是对最内层操作,输入分层级的编号可以指定对该层进行操作
如果不是所有级别的值都能在索引中找到的话,则unstack会自动生成缺失值
而stack操作会自动过滤缺失值,所以unstack和stack仍然是可逆的
若使用stack函数进行转换的同时想保留缺失值的话可以传入dropna = False参数
将长格式旋转为宽格式
pivot函数可以将长格式转为宽格式
pivot(index=None, columns=None, values=None)
其中index和value是可选参数,默认为原索引/数据columns是必选参数
注意如果设置index和columns,要注意有没有重叠的值,若有则会报错
pivot函数其实就是set_index函数和unstack()函数的组合
将宽格式转换成长格式
pivot函数的逆运算是melt函数,melt是pandas的函数,melt函数是将多个列合在一起产生一个长的DataFrame
上述的'key'是分组指标,分组指标也可以没有
也可以只选取子集来组成长的DataFrame
其中id_vars是分组指标,value_vars是选取的子集