一、概述
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