pandas中数据框的reshape操作

欢迎关注”生信修炼手册”!

数据框的长宽转换对于熟悉R语言的朋友而言,应该不会陌生。使用ggplot2画图时,最常用的数据处理就是长宽转换了。在pandas中,也提供了数据框的长宽转换功能,有以下几种实现方式

1. stack

stack函数的基本用法如下

>>> import pandas as pd
>>> import numpy as np
>>> a = pd.DataFrame(np.random.rand(4, 2),index=['G1', 'G2', 'G3', 'G4'], columns=['A', 'B'])
>>> a
           A B
G1 0.353756 0.349514
G2 0.958544 0.085568
G3 0.041538 0.910649
G4 0.230912 0.500152

>>> a.stack()
G1 A 0.353756
  B 0.349514
G2 A 0.958544
  B 0.085568
G3 A 0.041538
  B 0.910649
G4 A 0.230912
  B 0.500152
dtype: float64

用法很简单,将所有的列标签转换为行标签,将对应的值转换为新的数据框中的某一列,从而实现了数据框由宽到长的转换。

对于列标签为multiindex的情况,还可以通过level和dropna两个参数来控制其转换的行为。level参数指定multiindex的下标,默认为-1,使用最后一个index进行转换,用法如下

>>> multi_index = pd.MultiIndex.from_tuples([('groupA', 'A'),('groupB', 'B')])
>>> a = pd.DataFrame(np.random.rand(4, 2),index=['G1', 'G2', 'G3', 'G4'], columns=multi_index)
>>> a
  groupA   groupB
    A       B
G1 0.546331  0.808608
G2 0.013087  0.237910
G3 0.122436  0.174456
G4 0.329789  0.285292

# 默认用最后一个列标签,(A, B)
>>> a.stack()
   groupA  groupB
G1 A 0.546331 NaN
  B NaN    0.808608
G2 A 0.013087 NaN
  B NaN    0.237910
G3 A 0.122436 NaN
  B NaN    0.174456
G4 A 0.329789 NaN
  B NaN    0.285292

# 列标签的长度为2,下标-1和1对应同一个值
>>> a.stack(level=1)
   groupA  groupB
G1 A 0.546331 NaN
  B NaN    0.808608
G2 A 0.013087 NaN
  B NaN    0.237910
G3 A 0.122436 NaN
  B NaN    0.174456
G4 A 0.329789 NaN
  B NaN    0.285292

# 0表示使用第一个列标签(groupA, groupB)
>>> a.stack(level=0)
       A    B
G1 groupA 0.546331 NaN
  groupB NaN    0.808608
G2 groupA 0.013087 NaN
  groupB NaN    0.237910
G3 groupA 0.122436 NaN
  groupB NaN    0.174456
G4 groupA 0.329789 NaN
  groupB NaN    0.285292


# 也可以用列表的形式,同时指定多个标签
>>> a.stack(level=[0,1])
G1 groupA A 0.546331
  groupB B 0.808608
G2 groupA A 0.013087
  groupB B 0.237910
G3 groupA A 0.122436
  groupB B 0.174456
G4 groupA A 0.329789
  groupB B 0.285292
dtype: float64

指定了多个列标签时,全部转换会出现NaN值,默认情况下,会去除NaN值,这个行为有dropna参数进行控制,示例如下

# dropna默认值为True, 去除NaN
>>> a.stack(level=[0,1], dropna=True)
G1 groupA A 0.546331
  groupB B 0.808608
G2 groupA A 0.013087
  groupB B 0.237910
G3 groupA A 0.122436
  groupB B 0.1
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值