欢迎关注”生信修炼手册”!
数据框的长宽转换对于熟悉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