蟒蛇。如果第1列(第X行)的值=第2列(第Y行)的值,则打印第3列的第Y行

时间:2016-01-19 21:08:52

标签: csv dictionary rows

我有一个.csv文件,df,有3列(C1,C2和C3)。所有列的长度相同(aprox .600000行)并具有唯一值。表示SNP(单核苷酸多态性)的C1中的值根据它们在染色体上的位置排序。 C2具有与C1相同的值但它们是无序的。 C2中的值与C3上相同行中的对应值(染色体位置)耦合。我想要做的是将C3上的染色体位置与C1中的值相结合,保持C1的列顺序。换句话说,为C1上的有序SNP生成具有染色体位置的另一列。到目前为止,我尝试使用C2中的键和C3中的值创建一个字典,然后使用for循环匹配C1上的值并打印有序的染色体位置,但我得到了C3。我理解为什么我会这样做,但我无法得到我想要的东西。

欢迎任何建议/帮助。我是编程新手。

import csv

from collections import OrderedDict # to save keys order

import sys
sys.stdout = open("output1.csv", "w")

# C1= rows[0], C2= rows[1], C3= rows[2]
with open('df1.csv', 'rU') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    next(reader) #skip header
    d = OrderedDict((rows[1], rows[2]) for rows in reader)

for rows in reader:
    if rows[0] in d:
        print rows[2]

输入示例:

C1            C2          C3
12082473    2980300     785989
11240776    4245756     799463
2980300     12082473    740857
2905036     2341354     918573
4245756     3748597     888659
3748597     11240776    765269
2341354     2905036     792480
2465126     2465126     947034

期望的输出:

   C1         C4
12082473    740857
11240776    765269
2980300     785989
2905036     792480
4245756     799463
3748597     888659
2341354     918573
2465126     947034

1 个答案:

答案 0 :(得分:1)

我不完全确定我明白你要做什么。

我认为您的错误来自于使用生成器表达式d = OrderedDict((rows[0], rows[3]) for rows in reader1),然后在with块结束时关闭文件后引用它。

你可以尝试这些方法:

import csv
from collections import OrderedDict

d=OrderedDict()
with open('df1.csv', 'rU') as csv1, open('df2.csv', 'rU') as csv2:
    reader1 = csv.reader(csv1, delimiter=',')
    reader2 = csv.reader(csv2, delimiter=',')
    next(reader1) #skip header
    next(reader2) #skip header
    for row in reader1:
        d[row[0]]=row[3]
 #   d = OrderedDict(("a", "b") for rows in reader1)
    for row in reader2:
        if row[0] in d:
            print d[row[0]]

我认为您需要 OrderedDict没有任何理由,因为这只是row[0]row[3]之间的映射。您目前没有使用订单。