gpt4 book ai didi

python - 比较 pandas 数据框中的行值

转载 作者:行者123 更新时间:2023-11-30 23:17:52 26 4
gpt4 key购买 nike

我在 pandas 数据框中有数据,其中两列包含数字序列(开始和停止)。我想确定哪些行的停止值与下一行的起始值重叠。然后我需要将它们连接成一行,以便每行中只有由开始值和停止值表示的单个不重叠的数字序列。

我已将数据加载到 pandas 数据框中:

  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() 时,因为这显然不是正确的调用语法/位置。但我不知道纠正这个问题的正确方法。

一些指示会很棒。

SB:)

更新

这是一个BED file其中每一行指的是具有起始坐标和终止坐标的扩增子(基因组区域)。一些扩增子重叠;即开始坐标位于前一行的停止坐标之前。因此,我需要确定哪些行重叠并连接正确的开始和停止,以便每一行代表完全唯一的扩增子,不与任何其他行重叠。

最佳答案

我会尽力给你一些指导。

一个指针是您希望基于由移位的 bool 值组成的系列来获取行。也许您可以使用以下方法获得新的移位系列:

Boolean_Series = intermediate_bed.loc[:,'next_region_overlap'].shift(periods=1, freq=None, axis=0, **kwds)

有关此功能的更多背景信息: http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.shift.html

第二个指针是,通过使用这个移位的系列,您可以通过以下方式获取数据帧:

int_bed = bed.loc[Boolean_Series, :] 

有关索引的更多信息可以在这里找到: http://pandas.pydata.org/pandas-docs/dev/indexing.html

现在这些只是指针,我不知道这是否是一个实际的工作解决方案。

关于python - 比较 pandas 数据框中的行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27109160/

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