pandas重塑层次化索引(stack()和unstack()函数解析)

摘要:
分层索引可以为DataFrame的数据重排提供良好的一致性。Pandas提供了两个函数来实现重构,即stack()函数和unstack()函数。stack()函数将数据从“表结构”更改为“花括号结构”,即其行索引将变为列索引。相反,unstack()函数将数据从“花括号结构”更改为“表结构”,即将一层的列索引更改为行索引。unstack()函数的语法格式如下:DataFrame。unstack或Series unstack函数中的参数描述如下:level:接收int、string或其中的列表。默认值为-1,表示取消堆叠索引的级别或级别名称。

在数据处理时,有时需要对数据的结构进行重排,也称作是重塑(Reshape)或者轴向旋转(Pivot)。而运用层次化索引可为 DataFrame 的数据重排提供良好的一致性。在 pandas 中提供了实现重塑的两个函数,即 stack() 函数和 unstack() 函数。

常见的数据层次化结构有两种,一种是表格,如图 1 所示;另一种是“花括号”,如图 2 所示

pandas重塑层次化索引(stack()和unstack()函数解析)第1张

 图 1:表格结构

pandas重塑层次化索引(stack()和unstack()函数解析)第2张

图 2:花括号结构

 表格在行列方向上均有索引(类似于 DataFrame),花括号结构只有“列方向”上的索引(类似于层次化的 Series),结构更加偏向于堆叠(Series-stack)。

        stack() 函数会将数据从“表格结构”变成“花括号结构”,即将其行索引变成列索引,反之,

        unstack() 函数将数据从“花括号结构”变成“表格结构”,即要将其中一层的列索引变成行索引

stack() 函数

stack() 函数的语法格式如下:

DataFrame.stack(level=-1,dropna=True)

函数中的参数说明如下:

  • level:接收 int、str、list,默认为 -1,表示从列轴到索引轴堆叠的级别,定义为一个索引或标签,或者索引或标签列表;
  • dropna:接收布尔值,默认为 True,表示是否在缺失值的结果框架/系列中删除行。将列级别堆叠到索引轴上可以创建原始数据帧中缺失的索引值和列值的组合。

函数返回值为 DataFrame 或 Series。

unstack() 函数

unstack() 函数的语法格式如下:

DataFrame.unstack(level=-1, fill_value=None)

Series.unstack(level=-1, fill_value=None)

函数中的参数说明如下:

  • level:接收 int、string 或其中的列表,默认为 -1(最后一级),表示 unstack 索引的级别或级别名称。
  • fill_value:如果取消堆栈,则用此值替换 NaN 缺失值,默认为 None。

函数返回值为 DataFrame 或 Series。
使用 stack()、unstack() 函数的示例代码 example1.py 如下

import numpy as np
import pandas as pd
#创建DataFrame
data = pd.DataFrame(np.arange(4).reshape((2, 2)),
index=pd.Index(['row1', 'row2'], name='rows'),
columns=pd.Index(['one', 'two'], name='cols'))
print(data)
cols one two
rows 
row1 0 1
row2 2 3
#使用stack()函数改变data层次化结构 result = data.stack() print('data改变成"花括号"结构',' ',result) data改变成"花括号"结构 rows cols row1 one 0 two 1 row2 one 2 two 3
print('恢复到原来结构',' ',result.unstack()) 恢复到原来结构 cols one two rows row1 0 1 row2 2 3 print(result.unstack(0)) rows row1 row2 cols one 0 2 two 1 3 print(result.unstack('rows'))
#创建Series s1 = pd.Series([0, 1, 2, 3], index=['a', 'b', 'c', 'd']) s2 = pd.Series([4, 5, 6], index=['c', 'd', 'e']) data2 = pd.concat([s1, s2], keys=['one', 'two']) print(data2) print('将data2改变成表格结构',' ',data2.unstack()) #使用stack()函数改变成"花括号"结构,并删除缺失值行 print(data2.unstack().stack()) #使用stack()函数改变成"花括号"结构,不删除缺失值行 print(data2.unstack().stack(dropna=False)) #用字典创建DataFrame df = pd.DataFrame({'left': result, 'right': result + 3}, columns=pd.Index(['left', 'right'], name='side')) print(df) #使用unstack()、stack()函数 print(df.unstack('rows')) print(df.unstack('rows').stack('side'))

免责声明:文章转载自《pandas重塑层次化索引(stack()和unstack()函数解析)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PostgreSQL在湖南麒麟3.2下的安装配置马尔科夫信源下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

浅谈SQL Server中的三种物理连接操作

本文转自:https://msdn.microsoft.com/zh-cn/library/dn144699.aspx 感觉写的很好,特此收录,以备自己和需要的朋友查看 简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,M...

MS SQL Server:分区表、分区索引详解

MS SQL Server:分区表、分区索引 详解 1. 分区表简介使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。 大型表:数据量巨大的表。 访问模式:因目的不同,需访问的不同的数据行集,每种目的的访问可以称之为一种访问模式。分区一方面可以将数据分为更小、更易管理的部分,为提高性能起到一定的作用;另一方面,对于如果...

mssql 数据库 基本知识

数据库中禁用/启用标识列的自增长 SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON | OFF } 恢复数据时要让标识列可以插入数据,必须设置上面的属性为ON -----------------------------------------------...

R语言-基础解析

二、操作基础 %%取余 %/%整数除法 (1)eigen(...)求解方阵的特征值和特征向量 (2)solve(D,A)求解DX=A (3)data<-list(...)取里面的对象data[["列名称"]];data[[下标]];data$列名称 (4)unlist(列表对象)把列表对象转化为向量对象 (5)names(数据框)读取并编辑列的名称...

2048小游戏代码解析 C语言版

2048小游戏,也算是风靡一时的益智游戏。其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练。本篇分析2048小游戏的C语言实现代码。 前言 游戏截图:  游戏实现原理: 使用终端图形库文件curses绘制终端里的图形。 使用一个二维数组保存4 x 4 空格中的变量。 键盘输入控制移动,经过逻辑判断,二维数组数...

SQL性能调优

部分转自:http://www.cnblogs.com/luckybird/archive/2012/06/11/2544753.html 及http://www.cnblogs.com/kissdodog/p/3160560.html 着色部分为实际解决问题的过程 最常见的索引问题查找: 1、检查实际执行计划,使用图形化或者在执行语句前增加  set s...