使用一个文件的坐标并从另一个文件中添加匹配坐标值的Python脚本

1 投票
2 回答
686 浏览
提问于 2025-04-18 01:38

我有一组原始的基因组坐标(染色体,起始位置,结束位置),这些数据保存在一个用制表符分隔的bed文件里。同时,我还有一些其他的用制表符分隔的bed文件,这些文件里包含了一些原始的基因组坐标,并且每个坐标都有一个对应的数字值。这些坐标在一个bed文件中可能会出现多次,每次对应的数字值可能不同。我需要一个最终的bed文件,这个文件里包含每个原始的基因组坐标,以及与该坐标相关的所有数字值的总和。下面是我正在处理的文件示例。

原始文件:

chr1    2100    2300

chr2    3300    3600

chr1    2560    2800

其他bed文件:

chr1    2100    2300    6

chr2    3300    3600    56

chr1    2100    2300    10

需要的输出文件:

chr1    2100    2300    16

chr2    3300    3600    56

chr1    2560    2800    0

我需要写一个python脚本来完成这个任务,但我不太确定最好的方法是什么。

2 个回答

1

这是Pandas让事情变得非常简单的其中一个例子:

import pandas
coordnames = ['Name', 'x', 'y']
f1 = pandas.read_table('file1', delimiter=r' +', 
                       names=coordnames).dropna()
f2 = pandas.read_table('file2', delimiter=r' +', 
                       names=coordnames + ['n']).dropna()
result = (f1.merge(f2, on=coordnames, how='left')
          .groupby(coordnames).sum().fillna(0))
0

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能在使用某个特定的功能时,发现它并没有按照预期工作。这种情况很常见,通常需要我们仔细检查代码,看看哪里出了问题。

有时候,解决问题的方法很简单,只需要调整一下代码,或者查阅一下相关的文档和资料。对于初学者来说,最重要的是要保持耐心,慢慢来,逐步理解每一部分的功能和用法。

总之,编程的过程中遇到问题是很正常的,关键在于如何去解决这些问题,积累经验,提升自己的技能。

def fetch_data(filename1, filename2):
    lines = []
    data = {}
    with open (filename1) as f:
        lines = f.readlines()

    for line in lines:
        if not line.strip():
            continue
        data[' '.join(line.split())] = 0

    with open (filename2) as f:
        lines = f.readlines()

    for line in lines:
        if not line.strip():
            continue
        arr = line.split()
        data[' '.join(arr[:-1])] += int(arr[3])

    return data


with open ('output.txt', 'w') as f:
    for key,value in fetch_data('original.txt','data.txt').iteritems():
        f.write('{0}    {1} \n\n'.format('    '.join(key.split()), str(value)))

撰写回答