我的原始数据是纯文本文件。它由1255行和43列组成。我想创建一个只有我感兴趣的数据的文本文件,而不是处理所有数据。
例如,假设我想选择验证条件的所有数据:1 < column 26 < 7
。这是我的代码:
import numpy as np
import csv
import os
data = np.genfromtxt('data.txt', dtype = None)
path = os.getcwd()
csvfile = path + '/subgp1.txt'
counter = 0
with open(csvfile, 'w') as output:
writer = csv.writer(output, delimiter = '\t')
for row in range(len(data)):
if (data[row][26] > 1 and data[row][26] < 7):
counter += 1
writer.writerow([counter, data[row][1], data[row][2], data[row][3], ... data[row][42]])
代码中的最后一行是我只是将数据重新写入我创建的subgp1.txt
。是否有更有效的方法来做同样的事情?
我的理由是:
1。最后一行应该简化。就我而言,最后一行看起来像这样:
writer.writerow([counter, '%-8d' % data[row][1], data[row][2],
data[row][3], '%-2.6f' % data[row][4], '%-2.6f' % data[row][5],
'%-2.6f' % data[row][6], '%-2.2f' % data[row][7],
'%-2.2f' % data[row][8], '%-2.2f' % data[row][9], ..., '%-2.4f' % data[row][42]])
2。我有42列,所以这是浪费时间。我相信有更简洁,更快捷的方法。
包pandas
在与我寻求的任务类似的任务中是否更有效?
答案 0 :(得分:0)
而不是写作:
writer.writerow([counter, data[row][1], data[row][2], data[row][3], ... data[row][42]])
您可以将[counter]
与data[row]
切片连接起来:
writer.writerow([counter] + data[row][1:])
更好的是,您可以直接迭代数据行:
for row in data:
if (row[26] > 1 and row[26] < 7):
counter += 1
writer.writerow([counter] + row[1:])
答案 1 :(得分:0)
您需要为此导入集合,但之后您可以执行此操作:
for ctr,row in enumerate(collections.ifilter(lambda r:r[26]>1 and r[26]<7, data)):
writer.writerow([ctr, "%-8d' % row[1], row[2], row[3],
'%-2.6f' %row[4],...])
问题是你认为效率低下的是什么?一次指定每个字段的格式?
如果您提前了解格式,可以使用它。
format_strings = ('%d', '%-8d', '%s', '%s', '%-2.6f', ...)
for ctr,row in enumerate(collections.ifilter(lambda r:r[26]>1 and r[26]<7, data)):
writer.writerow([f%v for f,v in zip(format_strings, [ctr]+row)])