stack() unstack()函数

总结:

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
View Code

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
View Code

参考: 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]
View Code

参考: https://www.jb51.net/article/150975.htm

ttt

原文地址:https://www.cnblogs.com/xxswkl/p/11018563.html