我有一个带有12288 + 1 coluns的csv,并希望减少到4096 + 1 colums。
在这12288 + 1列中,它们在每三个上都是相同的值,最后一个值是一个位,0或1。
我需要保持最后一个值,并且对于重复的三个一组只需要1。
我的原始csv有300行或行,无论如何。我不知道如何捕捉其他行,而我的脚本只需要第一行/第一行。
来自原始csv 3,3,3,5,5,5,7,7,7,10,10,10 ... 20,20,20,50,50,50,1
想要最终的csv 3,5,7,10 ... 20,50,1
import csv
count, num = 0
a = ''
with open('data.csv','rb') as filecsv:
reader = csv.reader(filecsv)
for row in reader:
while count < 12290:
a = a + str(row[:][count])+','
count = count + 3
num = num + 1
print num
print a
这打印只是为了有个主意。
感谢您的帮助
答案 0 :(得分:0)
如果您不介意使用库,Pandas将能够很好地为您完成此操作。
您可以使用pandas.read_csv阅读csv。 use_cols参数指定要保留的列,因此您可以使用它来忽略这些重复的列。
columns = list(range(1,12288,3))
columns.append(12288)
data = pandas.read_csv('data.csv', usecols=columns)
data.to_csv('new_data.csv')
答案 1 :(得分:0)
如果他们总是三人一组,那就扔掉两个人。
分组成3组:
>>> row=range(9)
>>> [row[i:i+3] for i in range(0,len(row),3)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
但是,如果row
不是3的倍数,这将为您提供小于3的组:
>>> row=range(11)
>>> [row[i:i+3] for i in range(0,len(row),3)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]
^ ^ only two elements...
如果元素的数量可以是3的非倍数,请使用zip。它将丢弃不完整的r,g,b组:
>>> row=range(11)
>>> zip(*[iter(row)]*3)
[(0, 1, 2), (3, 4, 5), (6, 7, 8)]
然后解压缩到r,g,b组件:
import csv
with open('data.csv','rb') as filecsv:
reader = csv.reader(filecsv)
for row in reader:
for r, g, b in [row[i:i+3] for i in range(0,len(row),3)]:
# use r or g or b, ignore the other two
如果您获得ValueError
,则您拥有3组数据的非倍数(或者csv未正确解析数据)请按照说明使用zip
:
import csv
with open('data.csv','rb') as filecsv:
reader = csv.reader(filecsv)
for row in reader:
for r, g, b in zip(*[iter(row)]*3):
# use r or g or b, ignore the other two
(未经测试......)
答案 2 :(得分:0)
要删除连续重复项,可以使用itertools.groupby
function:
#!/usr/bin/env python
import csv
from itertools import groupby
from operator import itemgetter
with open('data.csv', 'rb') as file, open('output.csv', 'wb') as output_file:
writer = csv.writer(output_file)
for row in csv.reader(file):
writer.writerow(map(itemgetter(0), groupby(row)))
它读取输入的csv文件并将其写入输出csv文件并删除连续的重复项。
如果在行的最后可能存在相邻的重复0
,1
,则仅在row[:-1]
(除了最后一列之外的所有列)中删除重复项,并追加最后一位{{如果要保留它,请输入结果:
row[-1]