在多列

时间:2017-02-19 15:58:33

标签: python

问题:

如何将相同的python代码应用于多列数据。

数据格式:

我正在学习python,我编写了一个脚本来重新格式化我的数据。我当前的格式以4个描述性列开头,后跟多列数据(例如,1/1)

#CHROM POS REF ALT IND_1 IND_2 IND_3 IND_4
2L  6631    A   G   1/1 0/0 0/0 0/0
2L  6633    T   C   0/0 1/0 0/0 0/0
2L  6637    C   G   1/1 0/0 0/0 0/0

我试图将RE和ALT列中的0和1分别改为所需的结束格式:

2L  6631    A   G   G/G A/A A/A A/A
2L  6633    T   C   T/T C/T T/T T/T
2L  6637    C   G   G/G C/C C/C C/C 

到目前为止我有什么:

我编写了一个脚本,可以为一个列执行此操作,但我有100多列数据,所以我想知道是否有办法将此脚本应用于多个列而不是专门为每个列写出来

for line in openfile:
    ## skip header
    if line.startswith("#CHROM"):
        continue
    columns = line.rstrip().split("\t")
    CHROM = columns[0]
    POS = columns[1]
    REF = columns[2]
    ALT = columns[3]
    ALLELES1 = columns[4].replace("0",REF).replace("1",ALT).replace(".","0")
    ALLELES2 = columns[5].replace("0",REF).replace("1",ALT).replace(".","0")
    print CHROM, POS, REF, ALT, ALLELES1, ALLELES2

1 个答案:

答案 0 :(得分:2)

这是我的解决方案:

def read_data(filename):
    with open(filename, "r") as file_handle:
        for line in file_handle:
            # skip header
            if line.startswith("#CHROM"):
                continue
            columns = line.rstrip().split("\t")
            CHROM = columns[0]
            POS = columns[1]
            REF = columns[2]
            ALT = columns[3]
            ALLELS = [value.replace("0", REF).replace("1", ALT).replace(".", "0") for value in columns[4:]]
            print("\t".join(columns[0:4] + ALLELS))

你这样称呼它:

read_data("file.txt")

[value.replace("0", REF).replace("1", ALT).replace(".", "0") for value in columns[4:]]被称为"列表理解"。它查看列表的每个值并对其执行某些操作。请参阅Documentation

columns[4:]表示,查看我的所有列,然后从索引4开始直到最后一列为止。

sep="\t"语句中的

print表示您传递给print函数的所有元素都应该在它们之间打印一个TAB。

"\t".join(columns[0:4] + ALLELS)返回一个字符串,其中所有元素都由TAB连接。请参阅Stephen Rauch