查看原文
其他

图解Pandas的轴旋转函数:stack和unstack

Peter 尤而小屋 2022-05-28

公众号:尤而小屋
作者:Peter
编辑:Peter

大家好,我是Peter~ 今天带来的文章是图解Pandas中的两个重要的函数:stack和unstack。

stack和unstack是针对pandas的轴进行重新排列的两个方法,二者互为逆操作:

  • stack: 将数据的列columns转旋转成行index
  • unstack:将数据的行index旋转成列columns
  • 二者默认操作的都是最内层

一、Pandas连载文章

本文是Pandas更新的第16篇文章,欢迎访问阅读:

图解Pandas数据合并:concat、join、append

挑战SQL:图解Pandas的数据合并merge

图解Pandas重复值处理

下面通过详细的例子来进行讲解二者的用法,同时奉上官网学习地址:https://pandas.pydata.org/pandas-docs/stable/user_guide/reshaping.html#reshaping-stacking

二、stack

stack函数的主要作用是将原来的列转成最内层的行索引,转换之后都是多层次索引。官方原文:

Stack the prescribed level(s) from columns to index.

使用方法为:

pd.stack(level=-1, dropna=True)
  • level表示的是转换的是最内层(倒数第一级)
  • dropna表示的是对缺失值的处理

通过官网的一幅图来解释下:列属性AB变成了行索引AB

2.1对单层DataFrame进行stack操作

import pandas as pd 
import numpy as np

看下默认的情况:

我们发现df2的索引index也变成了多层次索引:

还有一个特点:当我们对单层的DataFrame进行stack操作之后,会变成Series型数据:

2.2对多层DataFrame进行stack操作

首先我们生成一个多层次的列数型

模拟出一份多层次列属性的数据:

看下模拟数据df3的相关信息:

type(df3)
pandas.core.frame.DataFrame

df3.index
Index(['小明''小红'], dtype='object')

df3.columns
MultiIndex([('information',    'sex'),
            ('information''weight')],)

看下stack之后的数据:

2.3二者比较

对比下原数据和生成的新数据:

1、索引index比较

2、列属性比较

3、数据类型比较

2.4参数level

level控制的是一个或者多个属性进行堆叠;可以使用数字索引或者名称索引。

模拟一份多层次的列属性数据:

multicol2 = pd.MultiIndex.from_tuples([('weight''kg'),  # 多层次列属性
                                       ('height''m')],
                                     name=["col","unit"])

data1 = pd.DataFrame([[1.02.0], [3.04.0]],
                     index=['cat''dog'],
                     columns=multicol2
                    )

data1

我们可以可以看到data1的列属性是多层次的:

data1.columns

# 结果
MultiIndex([('weight''kg'),
            ('height',  'm')],
           names=['col''unit'])

我们还可以使用列数的名称进行stack操作:

对于另一个"col"也是相同的操作:

还可以同时对多个进行操作,指定名称或者索引号:

2.5参数dropna

如果原数据中存在缺失值,我们该如何处理?模拟一份存在缺失值的数据:

data2 = pd.DataFrame([[None2.0],  # 引入一个缺失值
                      [4.06.0]],
                     index=['cat''dog'],
                     columns=multicol2)
data2

默认是是True,会删除同时为缺失值的情况:

如果我们改成False,会保留同时为NaN的数据:

三、unstack

将最内层的行索引变成列:就是行索引AB变成了列属性AB

3.1使用方法

unstack是stack的逆操作,将最内层的行索引变成列

unstack(level=- 1, fill_value=None)
  • level:进行操作的索引层级,可以是名称
  • fill_value:当我们进行操作的时候,如果产生了缺失值,可以用指定的值填充

3.2参数level

来自官网的两张图,在不同的索引号进行unstack操作的结果对比,默认是unstack(1):

我们使用之前的一份生成的数据,接下来我们对df5进行操作。

image-20210805001628811

1、使用unstack的默认操作:默认是对最里层操作

2、我们改成索引为0的行,同时我们也可以使用行的名称作为参数的值

3.3参数fill_value

该参数的作用是当我们使用unstack进行操作的时候,产生的缺失值用指定数据填充。

我们使用之前的df6数据框来进行操作:

使用unstack的默认情况:会产生两个空值

对产生的缺失值进行填充:

  • 默认情况的使用
  • 使用名称
  • 使用索引号

四、总结

stack和unstack主要是对Series或者DataFrame型数据进行堆叠和取消堆叠的操作,它们有个共同的特点就是:默认都是对最里层的索引号进行操作,二者互为逆操作,区别在于:stack是列转行,unstack是行转列。


推荐阅读


熬夜制作的瓜:8月份无疫烦!哈哈哈哈

图解Pandas数据合并:concat、join、append

挑战SQL:图解Pandas的数据合并merge

数据分析师=7大主题,24份资料

图解Pandas重复值处理

生日快乐:尤而小屋两周岁啦

尤而小屋,一个温馨的小屋。小屋主人,一手代码谋求生存,一手掌勺享受生活,欢迎你的光临

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存