简介
pandas中重新排列表格型数据的操作称为重塑(reshape)和轴向旋转(pivot)。可以将一个高维的数据按照想要的方式二维平铺展开。
重塑
重塑操作方法有两个:
- stack():将数据的列旋转为行;
- unstack():将数据的行旋转为列。
代码演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
>>>import numpy as np >>>import pandas as pd >>>data = pd.DataFrame(np.arange(9).reshape(3, 3), columns=pd.Index(list('abc'), name='title'), index=pd.Index(['aa', 'bb', 'cc'], name='list')) >>>data title a b c list aa 0 1 2 bb 3 4 5 cc 6 7 8 >>>df1 = data.stack() list title aa a 0 b 1 c 2 bb a 3 b 4 c 5 cc a 6 b 7 c 8 dtype: int32 |
默认stack将列转为行后,放在最内层。在这里就得到了一个Series。而通过unstack可以逆操作,将行转为列:
1 2 3 4 5 6 |
>>>df1.unstack() title a b c list aa 0 1 2 bb 3 4 5 cc 6 7 8 |
默认unstack也是转换最内层,或者我们可以传入分层级别的编号或名称显式指定要转换的行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>>df1.unstack(0) list aa bb cc title a 0 3 6 b 1 4 7 c 2 5 8 # 或 >>>df1.unstack('list') list aa bb cc title a 0 3 6 b 1 4 7 c 2 5 8 |
分层级别编号从外到内依次0,1…,或者指定该行的name
值也可以。
如果不是所有级别都能在各个分组中找到,unstack就会引入缺失值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
>>>a1 = pd.Series(np.arange(4), index=list('abcd')) >>>a1 a 0 b 1 c 2 d 3 dtype: int32 >>>a2 = pd.Series([4, 5, 6], index=list('cde')) >>>a2 c 4 d 5 e 6 dtype: int64 >>>df2 = pd.concat([a1, a2], keys=['data1', 'data2']) >>>df2 data1 a 0 b 1 c 2 d 3 data2 c 4 d 5 e 6 dtype: int64 # unstack行为列 >>>df2.unstack() a b c d e data1 0.0 1.0 2.0 3.0 NaN data2 NaN NaN 4.0 5.0 6.0 |
可以看出此时引入了缺失值,而使用stack默认会过滤缺失数据:
1 2 3 4 5 6 7 8 9 |
>>>df2.unstack().stack() data1 a 0.0 b 1.0 c 2.0 d 3.0 data2 c 4.0 d 5.0 e 6.0 dtype: float64 |
或者使用dropna
参数设定不过滤缺失值:
1 2 3 4 5 6 7 8 9 10 11 12 |
>>>df2.unstack().stack(dropna=False) data1 a 0.0 b 1.0 c 2.0 d 3.0 e NaN data2 a NaN b NaN c 4.0 d 5.0 e 6.0 dtype: float64 |
轴向旋转
假如有这样一个数据:
1 2 3 4 5 6 7 |
>>>df3 date item values 0 2018-11-22 a 5 1 2018-11-22 b 3 2 2018-11-23 b 2 3 2018-11-23 c 6 4 2018-11-24 c 1 |
事实上在数据库中,很多数据都是这样存储的,我们更希望将date
当做索引,不同的item
形成一列。因此就可以通过pivot()
方法实现:
1 2 3 4 5 6 |
>>>df3.pivot('date', 'item', 'values') item a b c date 2018-11-22 5.0 3.0 NaN 2018-11-23 NaN 2.0 6.0 2018-11-24 NaN NaN 1.0 |
前两个参数分别当做行和列,最后的参数来填充数据列。如果忽略最后一个参数,就会得到一个层次化索引:
1 2 3 4 5 6 7 |
>>>df3.pivot('date', 'item') values item a b c date 2018-11-22 5.0 3.0 NaN 2018-11-23 NaN 2.0 6.0 2018-11-24 NaN NaN 1.0 |
本质上pivot()
方法是set_index
和unstack
结合使用的快捷方式:
1 2 3 4 5 6 7 |
>>>df3.set_index(['date', 'item']).unstack('item') values item a b c date 2018-11-22 5.0 3.0 NaN 2018-11-23 NaN 2.0 6.0 2018-11-24 NaN NaN 1.0 |
总结
本文介绍了pandas中对数据的重排操作(重塑和轴向旋转),重排的好处是能够获得想要的数据形式,方便接下来的数据过滤和清理。