pandas.unstack()
当一个DataFrame有多个索引时,unstack() 这是一个根据索引行列转换的函数。个人认为初次接触比较难以理解。
这是针对于DataFrame这种类型的数据进行变换的一个函数,有一个重要的参数是level:
level : int, string, or list of these, default -1 (last level)
Level(s) of index to unstack, can pass level name
就是索引的序号——第几级索引。
用我自己的话说是,将第level个索引横向展开,其余的各级索引不动,不知道大家能不能理解。比如下面的例子SID的level为1,key的level为2.
如果还是不懂的话可以看下面这个例子:
转换后的column的values 还是一个numpy数组,只不过数组中的元素类型为元组。最后一句生成式的代码还可以重新命名表的列名。
>>> import pandas as pd
>>> df = pd.DataFrame({'month':[1,2,3],'year':[2,3,4]})
>>> df['SID'],df['key']=4,5
>>> df.set_index(['SID','key'],append=True)
month year
SID key
0 4 5 1 2
1 4 5 2 3
2 4 5 3 4
>>> df = df.set_index(['SID','key'],append=True)
>>> df
month year
SID key
0 4 5 1 2
1 4 5 2 3
2 4 5 3 4
>>> df = df.unstack(0)
>>> df
month year
0 1 2 0 1 2
SID key
4 5 1 2 3 2 3 4
>>> print(df.columns.values)
[('month', 0) ('month', 1) ('month', 2) ('year', 0) ('year', 1)
('year', 2)]
>>> type(df.columns.values)
<class 'numpy.ndarray'>
>>> type(df.columns.values[1])
<class 'tuple'>
>>> df.columns = ["_".join([str(i) for i in col]).strip() for col in df.columns.values]
>>> df
month_0 month_1 month_2 year_0 year_1 year_2
SID key
4 5 1 2 3 2 3 4