Pandas:将含列表的记录拆分为单独行(NCBI RefSeq UCSC Schema)
解决Pandas DataFrame中外显子坐标拆分问题
我来帮你搞定这个问题!这种把逗号分隔的多值列拆分成对应行的需求在处理基因组数据时特别常见,用Pandas就能轻松实现你的目标。
步骤说明
核心思路是先把逗号分隔的字符串转为数值列表,再通过explode方法将列表拆分成单独的行,同时保证exonStart和exonEnds的对应关系不混乱。
具体代码实现
首先构造你的原始DataFrame(如果已经有了可以跳过这一步):
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'chrom': ['chr1', 'chr1', 'chr2'], 'exonStart': ['100,200,300', '500,700', '50,60,70,80'], 'exonEnds': ['110,210,310', '600,800', '55,65,75,85'], 'name': ['gen1', 'gen2', 'gen3'] })
然后执行拆分操作:
# 1. 将逗号分隔的字符串转为整数列表 df['exonStart'] = df['exonStart'].str.split(',').apply(lambda x: [int(i) for i in x]) df['exonEnds'] = df['exonEnds'].str.split(',').apply(lambda x: [int(i) for i in x]) # 2. 同时对两列进行explode,拆分出每行对应一个外显子 df_exploded = df.explode(['exonStart', 'exonEnds'], ignore_index=True)
输出结果
运行后打印df_exploded就能得到你想要的格式:
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
小提示
- 使用
explode时同时传入两个列名是关键,这样能确保每个外显子的起始和终止坐标严格对应; ignore_index=True会重置结果的索引,让输出更整洁;- 如果你的原始数据中坐标是浮点型,把
int换成float即可。
内容的提问来源于stack exchange,提问作者Thedam
相关产品推荐
相关产品推荐

