我有这样一个Python ( NCBI RefSeq的UCSC模式):
chrom exonStart exonEnds name
chr1 100,200,300 110,210,310 gen1
chr1 500,700 600,800 gen2
chr2 50,60,70,80 55,65,75,85 gen3
我想对来自exonStarts和exonEnds的值进行配对,并将它们放在单独的行中(保留其余的相应信息):
chrom exonStart exonEnds name
chr1 100 110 gen1
chr1 200 210 gen1
chr1 300 310 gen1
chr1 500 600 gen2
chr1 700 800 gen2
chr2 50 55 gen3
chr2 60 65 gen3
chr2 70 75 gen3
chr2 80 85 gen3
我正在考虑使用python/大熊猫的组合功能如下:
拉链,劈开,融化,连接
但不知怎么的这对我不起作用
发布于 2018-04-19 06:16:59
在理解中使用zip
和split
pd.DataFrame([
[c, s, e, n]
for c, S, E, n in df.itertuples(index=False)
for s, e in zip(S.split(','), E.split(','))
], columns=df.columns)
chrom exonStart exonEnds name
0 chr1 100 110 gen1
1 chr1 200 210 gen1
2 chr1 300 310 gen1
3 chr1 500 600 gen2
4 chr1 700 800 gen2
5 chr2 50 55 gen3
6 chr2 60 65 gen3
7 chr2 70 75 gen3
8 chr2 80 85 gen3
发布于 2018-04-19 06:09:08
这是使用numpy
和intertools.chain
的一种方法。
这样做的目的是首先将逗号分隔的字段拆分为列表。然后构造一个结果数据,重复或链接值是必要的。
import numpy as np
from itertools import chain
df['exonStart'] = df['exonStart'].str.split(',')
df['exonEnds'] = df['exonEnds'].str.split(',')
lens = list(map(len, df['exonStart']))
res = pd.DataFrame({'chrom': np.repeat(df['chrom'], lens),
'exonStart': list(chain.from_iterable(df['exonStart'])),
'exonEnds': list(chain.from_iterable(df['exonEnds'])),
'name': np.repeat(df['name'], lens)})
print(res)
# chrom exonEnds exonStart name
# 0 chr1 110 100 gen1
# 0 chr1 210 200 gen1
# 0 chr1 310 300 gen1
# 1 chr1 600 500 gen2
# 1 chr1 800 700 gen2
# 2 chr2 55 50 gen3
# 2 chr2 65 60 gen3
# 2 chr2 75 70 gen3
# 2 chr2 85 80 gen3
注在此过程结束时,您可能希望将数值列转换为int
。
发布于 2018-04-19 06:23:56
通过使用unstack
和stack
,我想出了这个问题
df.set_index(['chrom','name']).apply(lambda x : x.str.split(','),1).\
stack().apply(pd.Series).stack().unstack(-2).\
reset_index().drop('level_2',1)
Out[1201]:
chrom name exonStart exonEnds
0 chr1 gen1 100 110
1 chr1 gen1 200 210
2 chr1 gen1 300 310
3 chr1 gen2 500 600
4 chr1 gen2 700 800
5 chr2 gen3 50 55
6 chr2 gen3 60 65
7 chr2 gen3 70 75
8 chr2 gen3 80 85
https://stackoverflow.com/questions/49923145
复制相似问题