一、概述
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
 
 微信扫一扫
微信扫一扫  支付宝扫一扫
支付宝扫一扫 