我有一个数据框,索引是基因组位置,值是p值:
import pandas as pd
from StringIO import StringIO
from collections import defaultdict
data = """Pos MedialIIvsD LateralIIvsD MedialP02IIvsD MedialP09IIvsD
chr1_-_12200 0.557431 0.066554 0.738343 0.029935
chr1_-_12600 0.737887 0.069167 0.829568 0.409495
chr1_-_48400 0.349833 0.600912 0.964103 0.765195
chr1_-_172800 0.729035 0.035198 0.866111 0.385711"""
df = pd.read_csv(StringIO(data), sep='\s+', index_col=False,
header=False)
此外,我还有一个dict,可以将不同的基因组位置映射到不同的基因:
pos_to_gene = defaultdict(list, {"chr1_-_12200": ["GENE1"],
"chr1_-_12600": ["GENE1", "GENE2"],
"chr1_-_172800": ["GENE3"]})
我想要实现的是在这个数据帧中添加Gene
作为列。这对我来说并不简单,因为在一个基因组位置可以有几个基因:
pd.Series(df.index.values).apply(lambda pos: pos_to_gene[pos])
0 [GENE1]
1 [GENE1, GENE2]
2 []
3 [GENE3]
dtype: object
如何以这样的长格式实现输出数据帧?你知道吗
Gene Pos MedialIIvsD LateralIIvsD MedialP02IIvsD MedialP09IIvsD
GENE1 chr1_-_12200 0.557431 0.066554 0.738343 0.029935
GENE1 chr1_-_12600 0.737887 0.069167 0.829568 0.409495
GENE2 chr1_-_12600 0.737887 0.069167 0.829568 0.409495
NaN chr1_-_48400 0.349833 0.600912 0.964103 0.765195
GENE3 chr1_-_172800 0.729035 0.035198 0.866111 0.385711
这里有个窍门pd系列(1,索引=…)并让熊猫对齐:
您可以重置索引,然后简单地加入:
如果要包含NaN行(答案中没有),那么outer join:
或者,您可以在纯python中创建
gene
(而不是使用apply):运用我在answer here中学到的知识:
退货
非常接近;只缺少其余的数据。你知道吗
现在剩下的就是合并堆叠的数据帧(
sdf
)和原始数据帧(df
)。你知道吗就这样!你知道吗
也许有更聪明的方法可以做到这一点。你知道吗
相关问题 更多 >
编程相关推荐