对于没学过Python的我来说,上来就让我做任务实在有些无情。不过总算在拖拖拉拉了5天之后实现了功能,还换来了师兄的一句不错。挺开心的。
我要实现的功能是,将传感器监测数据记录表,整理成需要的格式,具体如下:
左边是原始表格,右图是经过处理后格式更加整齐的表格。
贴上源代码,然后记录一下在编程过程中遇到的问题和解决方法~
1 import pandas as pd
2
3 # 输入文件名,将读入的数据存入total变量中
4 filename = 'TThickener endency_2017_06_26_16_05_43.csv'
5 total = pd.read_csv('D:\\spydata\\'+filename).drop(' DateTo', axis=1)
6
7 # 设置对DataFrame切片的关键词,获取其所在行数
8 pen_number = ['Pen Number']
9 breakpoint = total[total['Trend Name'].isin(pen_number)].index.tolist()
10 # 获取传感器的名字
11 pen_name = total[breakpoint[0]+1:breakpoint[1]][' Number of Curves'].reset_index(drop=True)
12 # 获取传感器采样的具体数据及采样时间
13 data = pd.DataFrame(total[breakpoint[1]+1:])
14 # 初始化标题域head和数据域result
15 head = pd.DataFrame()
16 result = pd.DataFrame()
17
18 # 循环遍历每一个传感器,将数据调整成需要的格式
19 for i in range(0, (breakpoint[1]-1)-(breakpoint[0]+1)):
20 if pen_name[i] in ['NENIT11', 'PEPIT01', 'THICKENER01_SPEED', 'DEDIT01', 'DEDIT02', 'FEFIT01']:
21 head = head.append(pd.DataFrame(['Date'])).append(pd.DataFrame([pen_name[i]])).reset_index(drop=True)
22 # 把该传感器所有的数据及采样时刻存入datum,并追加到result中
23 datum = data[data['Trend Name'] == str(i)].reset_index(drop=True).T
24 result = result.append(datum)
25
26 # 将head和result写入csv文件中,新文件格式为“new-filename”
27 head.T.to_csv('D:\\spydata\\' + 'new-' + filename, index=False, header=False)
28 result.T.drop('Trend Name', axis=1).to_csv('D:\\spydata\\' + 'new-' + filename, index=False, header=False, mode='a')
29
30 print('The new file was built successfully!')
1、我读入csv文件之后,发现最后一列数据是自己不需要的,因而可以先删掉,减少数据量。怎么删除呢?用到pandas里面的drop()。值得注意的是,python默认axis=0,也就是默认以“行”为操作对象。对我来说,我要删除一列,那么我就需要设置axis属性为1。
total = pd.read_csv('D:\\spydata\\'+filename).drop(' DateTo', axis=1)
2、根据关键词,搜索哪些行里有这个关键词,返回行号。用到isin()
breakpoint = total[total['Trend Name'].isin(pen_number)].index.tolist()
3、我提取出某一列的数据时,它还会带着之前的索引,所以为了方便接下来的工作,需要重新进行索引。用到下面这个函数:
reset_index(drop=True)
4、我提取了两组数据到两个DataFrame里面,如何将它们拼接起来?拼到下面?拼到右面?我参考了这个博主写的帖子,很有帮助
5、在我要循环遍历每一个传感器的时候,我的判断条件写的是 data[data['Trend Name'] == i],结果结果为空。为什么呢?因为此时i是int型数据,而查找的域里的数据时字符串,因而这个时候需要进行类型转换,也就是str(i),将i从int型变成字符串型。
6、将head和result输出到csv文件时,遇到了两个问题。第一个是,输出带索引,第二个是,每次输出会将前面的覆盖掉。解决这两个问题的方法是:将index和header设置成False,然后输出模式改为‘a'。
index=False, header=False, mode='a'