总结:
1.stack: 将数据的列索引转换为行索引(列索引可以简单理解为列名)
2.unstack:将数据的行索引转换为列索引
3.stack和unstack默认操作为最内层,可以用level参数指定操作层.
4.stack和unstack默认旋转轴的级别将会成果结果中的最低级别(最内层)
5.stack转换dataframe时,若只有一层列索引则转换后的类型为series,否则为dataframe
unstack转换dataframe时,若只有一层行索引,情况同上
import pandas as pd df = pd.DataFrame({ '类别':['水果'] * 3 + ['蔬菜'] * 3 , '名称':['苹果','梨','杏','菠菜','黄瓜','茄子'], '价格':[7,8,9,10,11,12]}) print(df) print(df.stack()) # 如下实现了行索引是类别,列索引是名称,交点处是价格 df.set_index(['类别','名称'], inplace=True) print(df.unstack()) # 类别 名称 价格 # 0 水果 苹果 7 # 1 水果 梨 8 # 2 水果 杏 9 # 3 蔬菜 菠菜 10 # 4 蔬菜 黄瓜 11 # 5 蔬菜 茄子 12 # 0 类别 水果 # 名称 苹果 # 价格 7 # 1 类别 水果 # 名称 梨 # 价格 8 # 2 类别 水果 # 名称 杏 # 价格 9 # 3 类别 蔬菜 # 名称 菠菜 # 价格 10 # 4 类别 蔬菜 # 名称 黄瓜 # 价格 11 # 5 类别 蔬菜 # 名称 茄子 # 价格 12 # dtype: object # 价格 # 名称 杏 梨 苹果 茄子 菠菜 黄瓜 # 类别 # 水果 9.0 8.0 7.0 NaN NaN NaN # 蔬菜 NaN NaN NaN 12.0 10.0 11.0
6 unstack对series做转换时,原先的行索引会消失,对Dataframe做转换时,不会消失
import pandas as pd df = pd.DataFrame({ '类别':['水果'] * 3 + ['蔬菜'] * 3 , '名称':['苹果','梨','杏','菠菜','黄瓜','茄子'], '价格':[7,8,9,10,11,12]}) print(df) # 注意当对series类型做unstack()的时候,原先的行索引会消失 # 但对Dataframe类型做unstack()的时候,不会消失 # 会消失 print(df.set_index(['名称','类别'])['价格'].unstack()) # 不消失 print(df.set_index(['名称','类别']).unstack()) print(df.set_index(['名称','类别'])[['价格']].unstack()) # 价格 名称 类别 # 0 7 苹果 水果 # 1 8 梨 水果 # 2 9 杏 水果 # 3 10 菠菜 蔬菜 # 4 11 黄瓜 蔬菜 # 5 12 茄子 蔬菜 # 类别 水果 蔬菜 # 名称 # 杏 9.0 NaN # 梨 8.0 NaN # 苹果 7.0 NaN # 茄子 NaN 12.0 # 菠菜 NaN 10.0 # 黄瓜 NaN 11.0 # 价格 # 类别 水果 蔬菜 # 名称 # 杏 9.0 NaN # 梨 8.0 NaN # 苹果 7.0 NaN # 茄子 NaN 12.0 # 菠菜 NaN 10.0 # 黄瓜 NaN 11.0 # 价格 # 类别 水果 蔬菜 # 名称 # 杏 9.0 NaN # 梨 8.0 NaN # 苹果 7.0 NaN # 茄子 NaN 12.0 # 菠菜 NaN 10.0 # 黄瓜 NaN 11.0
参考: https://www.cnblogs.com/bambipai/p/7658311.html
7 通俗的说unstack()是把索引从左边到上边,stack()是从上边到左边.下面是把多重索引变为单重索引的方法.
import pandas as pd a = pd.DataFrame({ 'id':['j','p','p','s'], 'RESULT_STRING':[1,2,3,4], 'values_max':[8,9,9,8], 'values_min':[5,5,5,5] }) print(a) print(a.set_index(['id','RESULT_STRING']).unstack()) r = a.set_index(['id','RESULT_STRING']).unstack().reset_index() print(r) # 由于是多重索引,把列名改成单重,更容易后序处理,这里把两个列名合并了. r.columns = [x[0]+str(x[1]) for x in r.columns] print(r) # id RESULT_STRING values_max values_min # 0 j 1 8 5 # 1 p 2 9 5 # 2 p 3 9 5 # 3 s 4 8 5 # values_max values_min # RESULT_STRING 1 2 3 4 1 2 3 4 # id # j 8.0 NaN NaN NaN 5.0 NaN NaN NaN # p NaN 9.0 9.0 NaN NaN 5.0 5.0 NaN # s NaN NaN NaN 8.0 NaN NaN NaN 5.0 # id values_max values_min # RESULT_STRING 1 2 3 4 1 2 3 4 # 0 j 8.0 NaN NaN NaN 5.0 NaN NaN NaN # 1 p NaN 9.0 9.0 NaN NaN 5.0 5.0 NaN # 2 s NaN NaN NaN 8.0 NaN NaN NaN 5.0 # id values_max1 values_max2 ... values_min2 values_min3 values_min4 # 0 j 8.0 NaN ... NaN NaN NaN # 1 p NaN 9.0 ... 5.0 5.0 NaN # 2 s NaN NaN ... NaN NaN 5.0 # # [3 rows x 9 columns]
参考: https://www.jb51.net/article/150975.htm
ttt