我有一个pandas数据框中的数据,其中两列包含数字序列(start和stop)。我想确定哪些行的停止值与下一行的开始值重叠。然后我需要将它们连接成一行,这样在每行中只有一个由起始值和终止值表示的无重叠的数字序列。
我已将数据加载到熊猫数据框中:
chr start stop geneID 0 chr13 32889584 32889814 BRCA2 1 chr13 32890536 32890737 BRCA2 2 chr13 32893194 32893307 BRCA2 3 chr13 32893282 32893400 BRCA2 4 chr13 32893363 32893466 BRCA2 5 chr13 32899127 32899242 BRCA2
我想比较数据框中的行。检查每一行的停止值是否小于下一行的开始值,然后在具有正确的开始值和停止值的新数据框中创建一行。理想情况下,当有多个行重叠时,这将一次连接所有行,但是我怀疑我将不得不迭代我的输出,直到不再发生这种情况。
到目前为止,我的代码可以识别是否存在重叠(改编自this post):
import pandas as pd
import numpy as np
columns = ['chr','start','stop','geneID']
bed = pd.read_table('bedfile.txt',sep='\s',names=['chr','start','stop','geneID'],engine='python')
def bed_prepare(inp_bed):
inp_bed['next_start'] = inp_bed['start'].shift(periods=-1)
inp_bed['distance_to_next'] = inp_bed['next_start'] - inp_bed['stop']
inp_bed['next_region_overlap'] = inp_bed['next_start'] < inp_bed['stop']
intermediate_bed = inp_bed
return intermediate_bed
这给了我这样的输出:
print bed_prepare(bed)
chr start stop geneID next_start distance_to_next next_region_overlap 0 chr13 32889584 32889814 BRCA2 32890536 722 False 1 chr13 32890536 32890737 BRCA2 32893194 2457 False 2 chr13 32893194 32893307 BRCA2 32893282 -25 True 3 chr13 32893282 32893400 BRCA2 32893363 -37 True 4 chr13 32893363 32893466 BRCA2 32899127 5661 False
我想将这个中间数据帧放入以下函数中,以便获得所需的输出(如下所示):
new_bed = pd.DataFrame(data=np.zeros((0,len(columns))),columns=columns)
def bed_collapse(intermediate_bed, new_bed,columns=columns):
for row in bed.itertuples():
output = {}
if row[7] == False:
# If row doesn't overlap next row, insert into new dataframe unchanged.
output_row = list(row[1:5])
if row[7] == True:
# For overlapping rows take the chromosome and start coordinate
output_row = list(row[1:3])
# Iterate to next row
bed.itertuples().next()
# append stop coordinate and geneID
output_row.append(row[3])
output_row.append(row[4])
#print output_row
for k, v in zip(columns,output_row): otpt[k] = v
#print output
new_bed = new_bed.append(otpt,ignore_index=True)
output_bed = new_bed
return output_bed
int_bed = bed_prepare(bed)
print bed_collapse(int_bed,new_bed)
期望输出:
chr start stop geneID 0 chr13 32889584 32889814 BRCA2 1 chr13 32890536 32890737 BRCA2 2 chr13 32893194 32893466 BRCA2 5 chr13 32899127 32899242 BRCA2
但是,当我运行这个函数时,我得到的原始数据帧没有改变。我知道问题是当我试图调用bed.itertuples().next()时,因为这显然不是调用的正确语法/位置。但我不知道该怎么纠正。
一些指针会很好。
某人:)
这是一个BED file,其中每一行都指向一个带有起始和终止坐标的扩增子(基因组区域)。有些放大器重叠(起始坐标在前一行的终止坐标之前)。因此,我需要确定哪些行重叠,并连接正确的开始和结束,以便每一行代表和完全唯一的放大器,不重叠任何其他行。
我不确定我是否理解您为什么要做您正在做的事情,但是您可以通过简单地使用索引来获得所需的输出。e、 g
这就是你最终想要做的吗?
更新 好吧,我知道你在做什么了。请记住,我从来没有处理过任何基因组数据,所以我不知道你的列中有多少行如此简单的“循环”可能相当慢(如果你有几十亿行这可能需要一段时间),但这是唯一想到的解决方案。首先要想到的是(注意:这不是一个成品,因为您需要确定如何处理引入的NaN以及如何处理循环终止)。
运行后:
我会给你一些建议。
一个指针是,您希望基于一个由移位的布尔值组成的序列获取行。可能您可以使用以下方法获得新的移位序列:
有关此功能的更多背景信息: http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.shift.html
第二个指针是,通过使用此移位序列,可以通过以下方式获取数据帧:
有关索引的详细信息,请访问: http://pandas.pydata.org/pandas-docs/dev/indexing.html
这些只是指针,我不知道这是否是一个实际的工作解决方案。
我修改了bed_prepare功能,以检查上一个和下一个基因组区域的重叠:
然后,我使用它们的布尔输出来存储用于写入步骤的变量:
这已经解决了我的问题,并给出了问题中指定的所需输出。:)
相关问题 更多 >
编程相关推荐