2013-09-28 49 views
0

我有一些csv数据和一段代码,可以自动删除csv内的行。我需要的是一些代码,可以将csv重新排列在列10中,列10最初排在第11列,但是这是在excel中实现的。数据中的注释总是按排名最低的顺序排列在页面最高处,并注意定义csv中每个数据集的唯一数据位于第3列中。我需要的是一些代码,用于根据第3列重新对第10列进行排名在删除一些行后定义每个数据集。重新排序后,行csv排除数据行

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 

现在,我们可以看到作为消除这些行的结果行列for unique datat1列10读取2,3,4这需要调整,以1,2,3同样在unique data3列10读取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 

亲切的问候SMNALLY

+1

权,所以要重新编号* *您的数据。 –

回答

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 
+0

看起来像是适合我的需求。我会测试我什么时候有点时间,我希望它能帮助OP。 – Ryflex

2

所以,你要通过3再由10元排名您行,对不对?

读取文件

由元件3线
ext = "C:\Users\Me\Desktop\\test.txt" 
readL = [] 

f = open(ext) 

for line in f: 

    readL += [line.strip().split(',')] 

f.close() 

排序列表,然后10:

from operator import itemgetter 
print sorted(readL, key=itemgetter(3,10)) 
+0

该代码似乎没有工作。我已经将你的代码的输出记录到了我的问题中。我也不能把它输出为csv。 – SMNALLY

+0

这里的代码运行良好;你有一个排序列表。该列表在哪里没有正确排序?只需使用'csv'模块再次写入数据。 –

+0

我会在问题中增加更多的细节来说明问题。 – SMNALLY