在删除行后重新排列csv中的数据

时间:2013-09-28 01:14:05

标签: python csv python-2.7 ranking rank

我有一些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

亲切的问候

2 个答案:

答案 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))