我有一个.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
答案 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]
之间的映射。您目前没有使用订单。