Python比较CSV文件的值

时间:2018-03-26 07:32:25

标签: python csv bioinformatics

我有一些问题需要对Python进行分析。

所以我有一个CSV文件(tab sep)。我有几个序列。对于每个序列,我可以拥有相同的基因。但是一个不同的价值(这里是TPM,即每百万翻译 - >生物学的东西)。

对于相同的序列,我想保留具有最低TPM值的基因。

我的数据示例:

geneschr start end Log2_TPM_DM_Moyenne

Cd74 chr18 60949182 60949365 4.253037

GAP6 chr18 60949182 60949365 10.590838

Rps14 chr18 60949182 60949365 12.590838

Mynn chr3 30500160 30500343 3.409878

Cd74 chr16 96205452 96205635 6.105927

例如:

3个第一序列相同但具有不同的注释基因(具有不同的TPM)。

对于这个序列,我想保留具有最低TPM值的序列。

有时候我有一个不同的序列,具有相同的最接近的注释基因(Cd74)。其中有相同的TPM。在这里,我想用2个TPM值保存两个序列,因为它们是不同的序列。

期望的输出:

基因 chr start end Log2_TPM_DM_Moyenne

Cd74 chr18 60949182 60949365 4.253037

Mynn chr3 30500160 30500343 3.409878

Cd74 chr16 96205452 96205635 6.105927

对于3个第一序列,只有Cd74是保守的,因为对于这个序列,它是具有最低TPM值的基因。

坐标是我序列的坐标,而不是基因的坐标。该序列用最接近的基因注释。 每个基因都具有TPM值。所以我可以使用相同的最接近的基因和相同的TPM值来获得独特的序列,我想保留它们。但对于具有不同注释基因的相同序列,我希望保持基因具有最低的TPM值。

我希望我很清楚,并且谢谢你。

最佳

1 个答案:

答案 0 :(得分:0)

不确定我明白你想要什么。但是你尝试了什么?你在等我们做作业吗?这就是为什么这个问题被低估了?

无论如何,我可能会从这样的事情开始,虽然这对于内存和CPU都没有优化。如果您的数据集有数百万行,这将不适合。

算法:     1.保持“开始”的所有不同值。并且'结束' ;     2.什么时候开始'并且'结束'是相同的,保持最低的TPM

import csv
#initiazing
columns = ['start','end','TPM','chr','genes']
keptValues = {}
for c in columns:
    keptValues[c]=[]
################    
def add(k,r):
    for c in columns:
        form = determineFormat(c)
        k[c].append(form(r[c]))
##################
def replace(i,k,r):
    #print('debug: ',i,k,r)
    for c in columns:
        form = determineFormat(c)
        k[c][i] = form(r[c])
#################        
def determineFormat(s):
    if s=='start' or s=='end':
        form = int
    elif s=='TPM':
        form = float
    else:
        form = str
    return form
#################    
with open('bioinfo.csv', 'r') as f:
    reader = csv.DictReader(f)
    for row in reader:
        if int(row['start']) in keptValues['start'] :
            ind = keptValues['start'].index(int(row['start']))
            if keptValues['end'][ind]==int(row['end']):
                if keptValues['TPM'][ind]>float(row['TPM']):
                    replace(ind,keptValues,row)
            else:
                add(keptValues,row)
        else:
            add(keptValues,row)