pandas unstack详解

一、概述

pandas是一个流行的数据处理库,而unstack是pandas中一个很常见的操作,它可以将pivot后的表再次变换成我们需要的格式,比如将二维的DataFrame转变为三维的Panel。在数据分析中,我们通常需要将数据进行一些重塑操作,以便更好地进行数据分析和建模。

二、unstack操作的基础用法

unstack的基础用法就是将多层的层次化索引转换成普通的列,比如下面的代码:

import pandas as pd
import numpy as np

# 创造一个多层索引的DataFrame
tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
                      'foo', 'foo', 'qux', 'qux'],
                     ['one', 'two', 'one', 'two',
                      'one', 'two', 'one', 'two']]))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])

# 对DataFrame进行unstack操作
df_unstacked = df.unstack()
print(df_unstacked)

它的输出结果如下:

               A                   B          
        one       two       one       two
bar -0.782904 -0.328571 -1.247849 -1.016532
baz -0.641387 -0.404023 -0.111008 -0.150736
foo  0.102076  0.443202  0.056593  0.596241
qux  0.534712  0.851135 -0.667280 -1.622218

可以看到,原来有两层索引的DataFrame被转换为了普通的二维表格,其中第一层索引成为了列的第一级,第二层索引成为了列的第二级。

三、unstack的高级用法

除了基础用法外,unstack还有很多高级的用法。比如,它可以指定转换后列的层级,以及转换后的数据类型等,下面将介绍一些常用的高级操作。

1. 指定unstack的级别

unstack默认会将最后一级索引转换为列,如果你不想将最后一级索引转换为列,可以指定转换某一级别的索引为列,例如下面的代码:

# 创造一个三层索引的DataFrame
index = pd.MultiIndex.from_tuples([('one', 'A', 'X'), 
                                   ('one', 'B', 'Y'), 
                                   ('two', 'C', 'Z'), 
                                   ('two', 'D', 'W')], 
                                   names=['first', 'second', 'third'])
df = pd.DataFrame(np.random.randn(4, 2), index=index, columns=['A', 'B'])

# 对DataFrame进行unstack操作
df_unstacked = df.unstack(level=1)
print(df_unstacked)

这里我们将第二层索引转换为列,输出结果如下:

                A                   B          
second          A         B         A         B
first third                                    
one   X   -1.029280 -0.331370 -1.369678 -0.758891
      Y    0.339987  0.696008  0.366717  3.316752
two   W    2.128560  0.111243 -0.798346  1.273068
      Z    1.162062  0.452590 -0.496570 -0.357904

我们可以看到,最终的结果中A和B对应的列被多了一个层级,这是因为我们指定了第二级索引转换为列。

2. 转换后的列重命名

unstack转换后的结果会默认使用多级列进行命名,但有时候我们需要自己定义列名,此时可以使用rename方法进行重命名,比如下面的代码:

# 创造一个三层索引的DataFrame
index = pd.MultiIndex.from_tuples([('one', 'A', 'X'), 
                                   ('one', 'B', 'Y'), 
                                   ('two', 'C', 'Z'), 
                                   ('two', 'D', 'W')], 
                                   names=['first', 'second', 'third'])
df = pd.DataFrame(np.random.randn(4, 2), index=index, columns=['A', 'B'])

# 对DataFrame进行unstack和列重命名操作
df_unstacked = df.unstack(level=1)
df_unstacked = df_unstacked.rename(columns={"A": "First", "B": "Second"})
print(df_unstacked)

这里我们将列A和B分别改名为First和Second,输出结果如下:

                First             Second          
second              A         B         A         B
first third                                    
one   X    -1.270645 -0.995538 -1.875756 -1.005831
      Y     0.182613  1.739008  0.246412 -0.777170
two   W    -0.731322 -0.744116 -0.492626 -1.574007
      Z     2.008461 -0.777942 -0.927567 -0.143443

3. 转换后数据类型的处理

在进行unstack操作后,由于新生成的列分层级命名,其数据类型可能会有变化,这时我们需要进行数据类型转换,比如下面的代码:

# 创造一个使用了Int32Dtype的三层索引的DataFrame
index = pd.MultiIndex.from_tuples([('one', 'A', 'X'), 
                                   ('one', 'B', 'Y'), 
                                   ('two', 'C', 'Z'), 
                                   ('two', 'D', 'W')], 
                                   names=['first', 'second', 'third'])
df = pd.DataFrame({'A': pd.Series([1, 2, 3], dtype=pd.Int32Dtype()),
                   'B': pd.Series([4, 5, 6], dtype=pd.Int32Dtype()),}, index=index)

# 对DataFrame进行unstack操作
df_unstacked = df.unstack(level=1)
df_unstacked = df_unstacked.astype(float)
print(df_unstacked)

这里我们将之前int32类型的列转换为float类型,输出结果如下:

                A                   B          
second          A         B         A         B
first third                                    
one   X    1.000000  4.000000  2.000000  5.000000
      Y    0.0  0.000000  0.000000  0.000000
two   W    0.0  0.000000  0.000000  0.000000
      Z    0.0  0.000000  0.000000  0.000000

四、unstack和pivot_table的比较

除了unstack操作,pandas还提供了另一个操作用于数据重塑,叫做pivot_table。二者有些相似之处,也有些不同。

1. 相似之处

在使用上,二者很相似,都是将数据透视成我们需要的形式,并且都需要指定需要透视的列和统计量。

2. 不同之处

二者的不同之处在于操作的对象不同。pivot_table是对DataFrame进行操作,而unstack是对Series或者DataFrame进行操作,并且unstack操作的结果可能会包含nan值,而pivot_table不会。

五、总结

在数据处理中,不同的数据形式可能需要不同的分析和处理方式。pandas的unstack操作提供了一种简单的数据重塑方式,可以将多层索引的DataFrame重塑成我们需要的形式。同时,pandas还提供了很多高级的用法,比如指定操作层级、重命名列以及数据类型转换等。与pivot_table不同,unstack可以对Series和DataFrame进行操作,并且比较灵活,但也需要注意到可能会出现nan值的情况。

原创文章,作者:XDCQJ,如若转载,请注明出处:https://www.506064.com/n/368705.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
XDCQJXDCQJ
上一篇 2025-04-12 01:13
下一篇 2025-04-12 01:13

相关推荐

  • Pandas下载whl指南

    本篇文章将从几个方面为大家详细解答如何下载Pandas的whl文件。 一、Pandas简介 Pandas是一个基于Python的软件库,主要用于数据分析、清洗和处理。在数据处理方面…

    编程 2025-04-28
  • 如何在Python中安装和使用Pandas

    本文将介绍如何安装和使用Python的Pandas库 一、Pandas库的介绍 Pandas是Python的一个数据分析库,提供了许多实用的数据结构和数据分析工具,可以帮助用户轻松…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论