我已经使用Python(2.7)堆积了几天的问题。我有来自2个不同群体的2个数据集A和B,包含沿着染色体的有序位置(由名称定义,例如rs4957684)以及它们在2个群体中的相应频率。 B中的大多数位置与A中的位置匹配。我需要在A和B中获得仅在A和B之间匹配的位置以及沿着染色体的相应顺序的频率。
我创建了一个包含4列的csv文件(df.csv):来自A(c1)的键,来自A(c2)的值,来自B(c3)的键,来自B(c4)的值。
首先,我创建了2个dic,dA和dB,分别来自A和B的键和值(位置和频率),并查找A和B之间匹配的键。从匹配的键我生成了2个新的dicts for A和B(dA2和dB2)。 问题在于,由于它们是dicts,我无法得到染色体中匹配位置的顺序,所以我想出了另一种策略:
沿c1迭代,查看c3中的任何键是否与c1中的有序键匹配。如果是,则返回带有匹配键的值(A和B)的有序列表。
我写了这段代码:
import csv
from collections import OrderedDict
with open('df.csv', mode='r') as infile: # input file
# to open the file in universal-newline mode
reader = csv.reader(open('df.csv', 'rU'), quotechar='"', delimiter = ',')
dA= dict((rows[1],rows[2]) for rows in reader)
dB= dict((rows[3],rows[4]) for rows in reader)
import sys
sys.stdout = open("df2.csv", "w")
for key, value in dB:
if rows[3] in dA.key():
print rows[2], rows[4]
这里脚本似乎运行但我没有输出
# I also tried this:
for row in reader:
if row[3] in dA.key():
print row[4]
......我也有同样的问题。
答案 0 :(得分:1)
如我所见,您导入了OrderedDict
,但没有使用它。您应该构建OrderedDict
以保存密钥顺序:
dict_a = OrderedDict((rows[1],rows[2]) for rows in reader)
dict_b = dict((rows[3],rows[4]) for rows in reader)
for key, value in dict_a.iteritems():
if dict_b[key] == value:
print value