对于没学过Python的我来说,上来就让我做任务实在有些无情。不过总算在拖拖拉拉了5天之后实现了功能,还换来了师兄的一句不错。挺开心的。

  我要实现的功能是,将传感器监测数据记录表,整理成需要的格式,具体如下:

  

python对于a列的每个数值计算b列的值 python根据a列提取b列的数据_类型转换

                                          

python对于a列的每个数值计算b列的值 python根据a列提取b列的数据_类型转换_02

  左边是原始表格,右图是经过处理后格式更加整齐的表格。

  贴上源代码,然后记录一下在编程过程中遇到的问题和解决方法~

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'