gpt4 book ai didi

python - 将值列表添加到行中,然后将数据帧转换为长格式

转载 作者:太空宇宙 更新时间:2023-11-03 17:44:35 26 4
gpt4 key购买 nike

我有一个数据框,其中索引是基因组位置,值是 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)

此外,我有一个将不同基因组位置映射到基因的字典:

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.Series(1, index=...) 并让 pandas 对齐:

In [11]: s = df["Pos"].apply(lambda x: pd.Series(1, pos_to_gene[x])).stack(0)

In [12]: s
Out[12]:
0 GENE1 1
1 GENE1 1
GENE2 1
3 GENE3 1
dtype: float64

您可以重置索引,然后简单地加入:

In [13]: s.index.names = [None, "Gene"]

In [14]: gene = s.reset_index("Gene")[["Gene"]]

In [15]: gene
Out[15]:
Gene
0 GENE1
1 GENE1
1 GENE2
3 GENE3

In [16]: gene.join(df)
Out[16]:
Gene Pos MedialIIvsD LateralIIvsD MedialP02IIvsD MedialP09IIvsD
0 GENE1 chr1_-_12200 0.557431 0.066554 0.738343 0.029935
1 GENE1 chr1_-_12600 0.737887 0.069167 0.829568 0.409495
1 GENE2 chr1_-_12600 0.737887 0.069167 0.829568 0.409495
3 GENE3 chr1_-_172800 0.729035 0.035198 0.866111 0.385711

如果您想包含 NaN 行(这不在您的答案中),则外连接:

In [17]: gene.join(df, how="outer")
Out[17]:
Gene Pos MedialIIvsD LateralIIvsD MedialP02IIvsD MedialP09IIvsD
0 GENE1 chr1_-_12200 0.557431 0.066554 0.738343 0.029935
1 GENE1 chr1_-_12600 0.737887 0.069167 0.829568 0.409495
1 GENE2 chr1_-_12600 0.737887 0.069167 0.829568 0.409495
2 NaN chr1_-_48400 0.349833 0.600912 0.964103 0.765195
3 GENE3 chr1_-_172800 0.729035 0.035198 0.866111 0.385711
<小时/>

作为替代方案,您可以在纯 Python 中创建 gene(而不是使用 apply):

inds, gens = [], []
for i, p in df["Pos"].iteritems():
for g in pos_to_gene[p]:
inds.append(i)
gens.append(g)
gene = pd.Series(gens, inds)

关于python - 将值列表添加到行中,然后将数据帧转换为长格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30005197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com