我有一个包含许多列的大型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.
修改 我尝试使用Daniel的代码,但由于某种原因,sort函数无法正常工作。 (我还需要使用反向排序而不是排序)。它只输出四个不同的键,另外,它们实际上并没有按降序排列。它还将标头作为其中一个值返回。
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])
答案 0 :(得分: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])
答案 1 :(得分: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)
我已经使用少量数据进行了测试,看起来很好,但我不确定这是否正是您所寻找的。 p>