我有一些csv数据和一段自动删除csv中的行的代码。我需要的是一堆代码,可以在colum 10中对csv进行排名,第10列最初排在第11列,但这是在excel中实现的。数据中的注意事项总是在页面下排列最低排名到最高,并注意在csv中定义每个数据集的唯一数据在第3列。我需要的是根据第3列重新排列第10列的一些代码在删除某些行后定义每个数据集。
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,1,141.88,data data data
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,2,141.85,data data data
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,3,140.81,data data data
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,4,131.86,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,1,163.85,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,2,163.24,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,3,162.93,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,4,161.23,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,5,159.83,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,6,156.71,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,7,155.49,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,8,154.96,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,9,147.96,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,10,142.34,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,11,140.09,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,12,129.7,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,1,169.5,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,2,165.2,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,3,165.1,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,4,160.45,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,5,159.8,data data data
运行一段代码后,我从csv中删除了特定的行,例如它现在看起来如下:
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,2,141.85,data data data
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,3,140.81,data data data
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,4,131.86,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,1,163.85,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,3,162.93,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,4,161.23,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,5,159.83,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,6,156.71,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,8,154.96,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,9,147.96,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,11,140.09,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,1,169.5,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,2,165.2,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,3,165.1,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,5,159.8,data data data
我们现在可以看到,删除这些行后,第10列中的排名for unique datat1
显示为2,3,4
,这需要在1,2,3
列10读取时同样调整为unique data3
1,2,3,5
这需要调整为1,2,3,4
所以调整后的csv会显示为:
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,1,141.85,data data data
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,2,140.81,data data data
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,3,131.86,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,1,163.85,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,2,162.93,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,3,161.23,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,4,159.83,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,5,156.71,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,6,154.96,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,7,147.96,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,8,140.09,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,1,169.5,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,2,165.2,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,3,165.1,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,4,159.8,data data data
亲切的问候
答案 0 :(得分:4)
在字典中存储一组itertools.count()
iterables,以保留每个唯一列值的计数器。如果您使用collections.defaultdict()
,只要遇到新的唯一值,就可以自动从1开始计数。
您的数据已经排序,所以您需要做的就是替换第10列:
import csv
from itertools import count
from collections import defaultdict
from functools import partial
counts = defaultdict(partial(count, 1)) # create a new count starting at 1
with open(output_csv_filename, 'wb') as outfile:
writer = csv.writer(outfile)
for row in your_list_of_rows:
row[9] = next(counts[row[2]]) # get the next count value
writer.writerow(row)
就是这样。 row[9]
是第10列;对于row[2]
(第3列)中找到的每个唯一值,它将从1开始填充数字。
计数器词典的快速演示:
>>> from itertools import count
>>> from collections import defaultdict
>>> from functools import partial
>>> counts = defaultdict(partial(count, 1))
>>> next(counts['foo'])
1
>>> next(counts['foo'])
2
>>> next(counts['bar'])
1
>>> next(counts['foo'])
3
在示例数据集上运行上述代码会导致:
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,1,141.85,data data data
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,2,140.81,data data data
1-20,data1,Unique data1,4,data2,14,data3.65,data4,data5,3,131.86,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,1,163.85,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,2,162.93,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,3,161.23,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,4,159.83,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,5,156.71,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,6,154.96,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,7,147.96,data data data
1-30,data1,Unique data2,4,data2,12,data3.30,data4,data5,8,140.09,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,1,169.5,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,2,165.2,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,3,165.1,data data data
1-50,data1,Unique data3,2,data2,16,data3.00,data4,data5,4,159.8,data data data
答案 1 :(得分:2)
所以,你想要按行排名第3,然后按第10个元素排序,对吧?
读取文件
ext = "C:\Users\Me\Desktop\\test.txt"
readL = []
f = open(ext)
for line in f:
readL += [line.strip().split(',')]
f.close()
按元素3然后按10排序行列表:
from operator import itemgetter
print sorted(readL, key=itemgetter(3,10))