首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >熊猫:用列表分隔行的记录

熊猫:用列表分隔行的记录
EN

Stack Overflow用户
提问于 2018-04-19 06:05:07
回答 3查看 285关注 0票数 1

我有这样一个Python ( NCBI RefSeq的UCSC模式):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的值进行配对,并将它们放在单独的行中(保留其余的相应信息):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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/大熊猫的组合功能如下:

拉链,劈开,融化,连接

但不知怎么的这对我不起作用

EN

回答 3

Stack Overflow用户

发布于 2018-04-19 06:16:59

在理解中使用zipsplit

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
票数 4
EN

Stack Overflow用户

发布于 2018-04-19 06:09:08

这是使用numpyintertools.chain的一种方法。

这样做的目的是首先将逗号分隔的字段拆分为列表。然后构造一个结果数据,重复或链接值是必要的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

票数 2
EN

Stack Overflow用户

发布于 2018-04-19 06:23:56

通过使用unstackstack,我想出了这个问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49923145

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文