我有一个文本文件(带标签分隔),例如:
Plate Well Group Type Sample Wavelength Reading Abs Meas. Time [s]
Plate 1 A05 Assay Blank Blank_Assay 1/1 340 1 0.113 0.080
Plate 1 A05 Assay Blank Blank_Assay 1/1 340 2 0.114 3.660
Plate 1 A05 Assay Blank Blank_Assay 1/1 340 3 0.114 7.230
Plate 1 A01 Assay Control Ctrl_0001 1/1 340 1 0.706 0.000
Plate 1 A01 Assay Control Ctrl_0001 1/1 340 2 0.706 3.580
Plate 1 A01 Assay Control Ctrl_0001 1/1 340 54 0.685 189.740
Plate 1 B01 Assay Control Ctrl_0002 1/1 340 4 0.698 11.220
等等。
我将其与\t
分隔符拆分并访问所有单独的列。
我希望它只是给我
A05 A01 B01
Time(S) Abs Abs Abs
0
我希望时间按时间顺序从0开始排序 - >最高数量并且在每个相应时间,相应的吸光度读数将被添加到相应的列(具有标题)。
我希望将最终输出输出到新文件。
答案 0 :(得分:0)
这对我有用:
import numpy as np
import collections
data = np.genfromtxt("values.csv",delimiter=' ',skip_header=1,dtype=None)
dataDict = {}
for i,dat in enumerate(data):
dataDict[dat[10]]=[dat[2],dat[9]]
orderedDict = collections.OrderedDict(sorted(dataDict.items()))
fp = open("outResult.csv",'wb')
fp.write(" \tA05\tA01\tB01\n")
fp.write("Time(S)\tAbs\tAbs\tAbs\n")
print " \tA05\tA01\tB01"
print "Time(S)\tAbs\tAbs\tAbs"
for key in orderedDict.keys():
str1 = ''
str2 = ''
str3 = ''
if orderedDict[key][0] == 'A01':
str1 = orderedDict[key][1]
str2 = ' '
str3 = ' '
elif orderedDict[key][0] == 'A05':
str1 = ' '
str2 = orderedDict[key][1]
str3 = ' '
else:
str1 = ' '
str2 = ' '
str3 = orderedDict[key][1]
fp.write("%.02f\t%s\t%s\t%s\n"%(key,str1,str2,str3))
print "%.02f\t%s\t%s\t%s"%(key,str1,str2,str3)
fp.close()
答案 1 :(得分:0)
你说:
我希望时间按时间顺序从0开始排序 - > 最高数量和每个相应的时间,相应的 将吸光度读数添加到相应的色谱柱中(使用 头)。
查看您最初使用问题发布的完整数据(在编辑器被截断之前),您将无法根据Meas. Time [s]
列匹配abs读数,因为这不是A05,A01和B01的每个读数相同。相反,(我认为?)Reading
数字列是加入相应读数的方式,因为对于所有井,Meas. Time [s]
对于每个读数都是相似的。
因此,使用Python csv模块,读取文件并按Reading
列对数据进行分组。然后按顺序迭代分组的读数,为每个Abs
获取Well
的值。分组是使用collections.defaultdict
的dicts完成的。
import csv
from collections import defaultdict
# CSV column numbers
WELL_COL = 1
READING_COL = 6
ABS_COL = 7
with open('readings') as infile:
data = defaultdict(dict)
reader = csv.reader(infile, delimiter='\t')
_ = next(reader) # skip the header line
for row in reader:
data[int(row[READING_COL])][row[WELL_COL]] = row[ABS_COL]
outfile_fmt = '{:<10}{:<10}{:<10}{}\n' # N.B. new line suitable for file.write(), not print()
with open('abs_readings', 'w') as outfile:
outfile.write(outfile_fmt.format('', 'A05', 'A01', 'B01'))
outfile.write(outfile_fmt.format('Reading', 'Abs', 'Abs', 'Abs'))
for reading, abs in sorted(data.items()):
outfile.write(outfile_fmt.format(reading, abs['A05'], abs['A01'], abs['B01']))
从CSV文件中读取数据后,data
如下所示:
>>> from pprint import pprint
>>> pprint(data.items())
[(1, {'A01': '0.706', 'A05': '0.113', 'B01': '0.698'}),
(2, {'A01': '0.706', 'A05': '0.114', 'B01': '0.698'}),
(3, {'A01': '0.705', 'A05': '0.114', 'B01': '0.698'}),
(4, {'A01': '0.705', 'A05': '0.114', 'B01': '0.698'}),
(5, {'A01': '0.705', 'A05': '0.114', 'B01': '0.698'}),
(6, {'A01': '0.705', 'A05': '0.114', 'B01': '0.698'}),
(7, {'A01': '0.704', 'A05': '0.114', 'B01': '0.697'}),
(8, {'A01': '0.703', 'A05': '0.114', 'B01': '0.697'}),
(9, {'A01': '0.703', 'A05': '0.114', 'B01': '0.696'}),
(10, {'A01': '0.702', 'A05': '0.114', 'B01': '0.696'}),
(11, {'A01': '0.702', 'A05': '0.114', 'B01': '0.696'}),
.
.
.
(59, {'A01': '0.684', 'A05': '0.114', 'B01': '0.679'}),
(60, {'A01': '0.683', 'A05': '0.114', 'B01': '0.678'})]
最后,迭代字典(按读数排序)并输出abs值。最终输出应如下所示:
A05 A01 B01 Reading Abs Abs Abs 1 0.113 0.706 0.698 2 0.114 0.706 0.698 3 0.114 0.705 0.698 4 0.114 0.705 0.698 5 0.114 0.705 0.698 6 0.114 0.705 0.698 7 0.114 0.704 0.697 8 0.114 0.703 0.697 9 0.114 0.703 0.696 10 0.114 0.702 0.696 11 0.114 0.702 0.696 . . . 59 0.114 0.684 0.679 60 0.114 0.683 0.678