多层索引透视
'''
stack():将指定的列索引透视为第二层行索引,类型为Series
参数
level:层级序号或层级名称,默认-1
level:层次索引的层级。从0开始分别对应第一层等索引,若为-1,则代表最里面一层索引。
dropna:过滤掉缺失值,默认True
'''
f1=pd.DataFrame(np.arange(6).reshape(2,3),
index=pd.Index(['i1','i2'],name='state'),
columns=pd.Index(['one','two','three'],name='number'))
print(f1)
'''
number one two three
state
i1 0 1 2
i2 3 4 5
'''
result=f1.stack()
print(result)
'''
state number
i1 one 0
two 1
three 2
i2 one 3
two 4
three 5
'''
'''
unstack():stack()的逆向操作,将指定的行索引透视为列索引
当f1非Series时,f1.unstack(),是将f1的列索引透视为1的第一层行索引
'''
f1=pd.DataFrame(np.arange(6).reshape(2,3),
index=pd.Index(['i1','i2'],name='state'),
columns=pd.Index(['one','two','three'],name='number'))
print(f1)
'''
number one two three
state
i1 0 1 2
i2 3 4 5
'''
result=f1.unstack()
print(result)
'''
number state
one i1 0
i2 3
two i1 1
i2 4
three i1 2
i2 5
'''
print(result.unstack())
'''
i1 i2
one 0 3
two 1 4
three 2 5
'''
print(result.unstack(0))
'''
number one two three
state
i1 0 1 2
i2 3 4 5
'''
轴向转换
'''
pivot(index,columns,values):index指定为行索引,columns是列索引,values是DataFrame中的值
将‘长’透视为‘宽’
'''
df = pd.DataFrame({'水果种类':['苹果','苹果','梨','梨','草莓','草莓'],
'信息':['价格','数量','价格','数量','价格','数量'],
'值1':[4,3,5,4,6,5],
'值2':[1,2,3,4,5,6]})
print(df)
print('--------------------------------------')
'''
水果种类 信息 值1 值2
0 苹果 价格 4 1
1 苹果 数量 3 2
2 梨 价格 5 3
3 梨 数量 4 4
4 草莓 价格 6 5
5 草莓 数量 5 6
'''
print(df.pivot('水果种类','信息',['值1','值2']))
#等价于df.set_index(['水果种类','信息']).unstack()
'''
值1 值2
信息 价格 数量 价格 数量
水果种类
梨 5 4 3 4
苹果 4 3 1 2
草莓 6 5 5 6
'''
'''
将‘宽’透视为‘长’
pandas.melt()
frame:要处理的数据集。
id_vars:不需要被转换的列名。
value_vars:需要转换的列名,如果剩下的列全部都要转换,就不用写了。
var_name和value_name是自定义设置对应的列名。
col_level :如果列是MultiIndex,则使用此级别。
'''
df = pd.DataFrame({'A': [1,4,7],
'B': [2,5,8],
'C': [3,6,9]})
print(df)
'''
A B C
0 1 2 3
1 4 5 6
2 7 8 9
'''
# 保留 B 列,并不转化A
df_1=df.melt(id_vars=['A'], value_vars=['B'])
print(df_1)
'''
A variable value
0 1 B 2
1 4 B 5
2 7 B 8
'''
# 保留 B C列,并自定义列名
df_2=df.melt(value_vars=['B','C'],var_name='myVarname', value_name='myValname')
print(df_2)
'''
myVarname myValname
0 B 2
1 B 5
2 B 8
3 C 3
4 C 6
5 C 9
'''
#指定层级
df.columns = [list('ABC'), list('DEF')]
df3=df.melt(id_vars=[('A','D')],value_vars=[('B','E')],var_name=['myVarname1','myVarname2'], value_name='myValname')
print(df3)
'''
(A, D) myVarname1 myVarname2 myValname
0 1 B E 2
1 4 B E 5
2 7 B E 8
'''
df4=df.melt(id_vars='A',value_vars='B',col_level=0)
print(df4)
'''
A variable value
0 1 B 2
1 4 B 5
2 7 B 8
'''