pandas_重塑和透视

多层索引透视

'''
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
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值