数据处理过程中,经常需要将二维数据转换为一维,或者将一维转换为二维报表的形式,在Excel中需要借助数据透视表进行一维转二维,在pandas中有许多重塑(reshape)或者轴向旋转(pivot)运算。
重塑层次化索引
层次索引化为DataFrame数据的重排任务提供了一种具有良好一致性的方式:stack :将数据的列旋转为行;
unstack:将数据的行旋转为列
data = DataFrame(np.arange(6).reshape((2,3)),
index =pd.Index(['Ohio','Colorado'],name='state'),
columns = pd.Index(['one','two','three'],name='unmber'))
data
result =data.stack()
result
对于一个层次化索引的Series,可以通过unstack重排为一个DataFrame,unstack操作的是最内层,传入分层级别的编号或者名称即可对其他级别进行unstack。
stack会默认将缺失值过滤,如果要保留缺失值需要传入dropna = False;
时间序列中将长格式旋转为宽格式
在MySQL关系型数据库中,数据的存储格式(ldate的前3行如下)
date item value
0 1959-03-31 00:00:00 realgdp 276.2
1 1959-03-31 00:00:00 infl 214.224
2 1959-03-31 00:00:00 unemp 4.232
如果想将以上数据转换为DataFrame,实现不同的item值分别形式一列,date中的值则用作索引,则需要使用DataFrame的pivot的方法。
对实例化数据框.pivot相当于excel中的透视表功能,指定行的索引,指定列的字段,数据填充来源。
ldate.pivot(‘date’,‘item’,‘value’)
前两个参数值分别用做行和列索引的列名,最后一个参数值则是用于填充DataFrame的数据列的列名,和Excel中不同的是pivot方法中如果忽略最后一个参数值,则当有多个标量时,就会得到一个带有层次化的列:
如上例中有两个需要参与重塑的数据列
ldate['value2'] = np.random.randn(len(ldate)) #增加一个数据列value2
当忽略最后一个参数时,默认两个数据列进行重排,那么两个数据列就会以一个层次化的列DataFrame。
小结:
在数据清理规整过程中,需要对数据进行行列转换,按轴重排则需使用到stack/unsack/pivot的方法,使得数据以想要的方式实现重排。