在python中的Vlookup

时间:2014-07-30 20:20:11

标签: python text-processing

我是python的新手并尽可能快地学习。我知道如何在bash中解决我的问题并尝试使用python。 我有一个数据文件(示例中为data_array.csv)和索引文件index.csv,在该文件中我想从数据文件中提取索引文件中具有相同ID并存储到新文件中的数据, Out.txt。我还想在Out.txt中为那些在数据文件中没有值的ID添加NA。我知道如何为一列做到这一点。但我的数据有超过1000列(从1到1344)。我希望你帮助我一个可以更快地完成它的脚本。我的数据文件,索引ID和建议输出如下。

data_array.csv

Id  1   2   3   .   .   1344
1   10  20  30  .   .   -1
2   20  30  40  .   .   -2
3   30  40  50  .   .   -3
4   40  50  60  .   .   -4
6   60  60  70  .   .   -5
8   80  70  80  .   .   -6
10  100 80  90  .   .   -7

index.csv

Id
1
2
8
9
10

必需输出

Out.txt

Id  1   2   3   .   .   1344
1   10  20  30  .   .   -1
2   20  30  40  .   .   -2
8   80  70  80  .   .   -6
9   NA  NA  NA          NA
10  100 80  90  .   .   -7

我试过

#! /usr/bin/python

import csv

with open('data_array.csv','r') as lookuplist:
    with open('index.csv', "r") as csvinput:
        with open('VlookupOut','w') as output:

            reader = csv.reader(lookuplist)
            reader2 = csv.reader(csvinput)
            writer = csv.writer(output)

            for i in reader2:
                for xl in reader:
                    if i[0] == xl[0]:
                        i.append(xl[1:])
                        writer.writerow(i)

但它只适用于第一行。我希望该程序适用于我的数据文件的整个行和列。

2 个答案:

答案 0 :(得分:2)

它只输出第一行,因为第一次在xl in reader之后,你就在文件的末尾。之后你需要指向文件的开头。为了提高效率,您可以先将csvinput读入字典,然后使用字典查找来获取所需的行:

#! /usr/bin/python

import csv

with open('data_array.csv','r') as lookuplist:
    with open('index.csv', "r") as csvinput:
        with open('VlookupOut','w') as output:

            reader = csv.reader(lookuplist)
            reader2 = csv.reader(csvinput)
            writer = csv.writer(output)

            d = {}
            for xl in reader2:
                d[xl[0]] = xl[1:]

            for i in reader:
                if i[0] in d:
                    i.append(d[i[0]])
                writer.writerow(i)

答案 1 :(得分:1)

当您使用for xl in reader读取CSV文件时,它将遍历每一行,直到它结束。但它只会这样做一次。您可以使用.seek(0)告诉它返回CSV文件的第一行。

#! /usr/bin/python

import csv

with open('data_array.csv','r') as lookuplist:
    with open('index.csv', "r") as csvinput:
        with open('VlookupOut','w') as output:

            reader = csv.reader(lookuplist)
            reader2 = csv.reader(csvinput)
            writer = csv.writer(output)

            for i in reader2:
                for xl in reader:
                    if i[0] == xl[0]:
                        i.append(xl[1:])
                        writer.writerow(i)
                lookuplist.seek(0)