2

我有一个包含许多列的大型 CSV 文件,如下所示:

id, col1, col2, col3, col4, col5
1, a, b, 2, d, e
2, b, c, 4, e, f
3, c, d, 6, f, g

我希望能够创建一个只使用某些列的字典。例如,字典将具有 id 号、col2 和 col3。此外,它应该只存储 col2 中具有最高 10 个数字的行。这是我的代码:

import csv 
reader = csv.DictReader(open('SNPs.csv', newline=''), delimiter=',', quotechar='"')

但我不知道如何告诉它忽略某些列,而且我认为我不能使用 max() 返回多个值。

max(2, 4) returns 4. 

编辑 我尝试使用丹尼尔的代码,但由于某种原因,排序功能无法正常工作。(我还需要使用反向排序而不是排序)。它只输出四个不同的键,此外,它们实际上并没有按数字降序排序。它还将标头作为值之一返回。

import csv
f = open('SNPs.csv', "rU")
reader = csv.reader(f)
output = [row for row in reader]
output.sort(key=lambda x: x[32], reverse=True)
print dict((row[10], (row[11], row[8], row[32])) for row in output[:10])
4

2 回答 2

2

col2没有任何数字。我假设你的意思是col3.

在你全部读完之前,你无法分辨出 col3 中哪十个最高的数字。因此,既然您无论如何都会这样做,那么您不妨阅读所有内容,然后提取前十名。所以你可以做这样的事情:

output = []
for row in reader:
    output.append(dict(k, v) for k, v in row if k in ('id', 'col2', 'col3'))
output.sort(key=lambda x: x['col3'])
return output[:10]

编辑现在我看到了你想要的输出,你想要的东西与我想象的完全不同。实际上 DictReader 在这里完全没有意义,所以我会用普通的 Reader 重写。

f = open('SNPs.csv')
reader = csv.Reader(f, delimiter=',', quotechar='"')
output = [row for row in reader]
output.sort(key=lambda x: x[3])
return dict((row[0], (row[3], row[4])) for row in output[:10])
于 2012-11-04T21:39:58.450 回答
0

也许这有效:

f = open("SNPs.csv", "rU")
reader = csv.reader(f)
data = [row for row in reader] #This only works if you have enough memory to do so
set_highest_ten = set(row[32] for row in sorted(
                                      data, key = lambda x: x[32], reverse = True)[0:10])
d = dict((row[10], (row[11], row[8], row[32])) for row in data
                                                       if row[32] in set_highest_ten)

我已经用少量数据进行了测试,看起来不错,但我不确定这是否正是您要寻找的。

于 2012-11-05T14:18:55.413 回答