我在CSV文件中有以下两列数据库:
31 ID1
42 ID2
22 ID3
42 ID4
其中包含第一列中的类号和第二列中的信息(以空格分隔)。
我希望将它转换为按实数排序。第一个元素将被分配一个类号1,依此类推。但是类号必须与原始文件中的顺序相同,如下例所示:
1 ID1
2 ID2
3 ID3
2 ID4
我认为可以使用zip
函数完成此操作。有人对此有任何建议吗?
答案 0 :(得分:4)
您应该可以使用defaultdict
和计数器来计算类标签
import csv
import itertools
import collections
ID = itertools.count(1)
labels = collections.defaultdict(lambda : next(ID))
with open('path/to/input') as infile, open('path/to/output', 'w') as fout:
outfile = csv.writer(fout, delimiter=' ', dialect='excel')
for val, name in csv.reader(infile, delimiter=' '):
outfile.writerow([name.strip(), labels[val]])
编辑(某些文档):
itertools.count(1)
为您提供了一组数字:1,2,3,4 ....这些将作为您的班级标签
collections.defaultdict
的工作方式类似于字典,但需要一个可选的参数。当您向defaultdict询问它没有的键的值时,它会创建该键,将其添加到字典中,并为其提供可选参数指定的默认值。我给它一个默认值,要求我创建的itertools.count
对象的下一个值。因此,如果在defaultdict中添加一个新值,它将获得一个新的类标签
因此,对于输入文件中的每一行,我通过询问defaultdict来获取类标签。如果之前已经看到了值(比如42),它会给我以前分配的类标签。但是如果之前没有看到过该值,它会为该值创建一个新的类标签(因为defaultdict和itertools.count的工作方式),并为我提供了新的类标签
答案 1 :(得分:0)
您可以使用list
来存储类而不重复,然后使用element's index + 1
作为新的"类ID",例如:
# First, import data -- you may use the `csv` module also
filename = 'test.csv'
encoding = 'utf-8'
with open(filename) as fobj:
data = fobj.read().decode(encoding)
data = [line.split() for line in lines.split('\n')]
# Create the classes list -- can't use a `set` because we need it ordered
classes = []
for x, y in data:
if y not in classes:
classes.append(y)
# To see the final result:
for x, y in data:
print x, classes.index(y) + 1