Python数据处理见闻
事情是这样的:作为大数据专业学生,有一天老师突然给出了2个多G的csv文件。没做具体任务要求,算是拿着玩。
第一个问题:各种常用文档编辑器都打不开这么大的文件
解决:使用Emeditor,支持文本分段打开,绝活。
第二个问题:对于数据实现简单清洗
描述:老师给出的数据集与交通有关,于是乎其中少不了一个记录车辆速度的字段,虽然不知道单位,但我决定把速度>300的数据分离出来。
解决:在学长的帮助下,用了十行python代码实现...
import pandas as pd #导入pandas库,这是我们此次行动的主C import numpy as np # file_name = './gps.csv' # Data = pd.read_csv(file_name, encoding='utf-8', sep='\t', # names=range(8),dtype=str) file_name = 'new.csv' #数据集与python程序在同一文件下,故使用相对路径 DataDF = pd.read_csv(file_name, names=range(7) ,header=None ,sep='\t',encoding='utf-8') #数据集没有列名,分隔符为制表符 DataDF.columns = ['ID', 'Tim','lgd','ltd','dir','spe','f']#添加列名 pd.set_option('display.max_rows', 10)#设置打印行数 #pd.set_option('display.max_columns', None) np.set_printoptions(threshold=1e6)#设置输出的全部内容为1e6条,之后的省略 #DataDF.dtypes查看数据类型 #DataDF.shape查看多少行多少列 #DataDF.isnull().sum().sort_values(ascending=False)查找缺失数据 #DataDF.head()抽出一定数据查看 #DataDF.info() 数据类型 #print(DataDF) #print(DataDF.info)() #print(DataDF.shape) #subDataDF1=DataDF["spe"]切片投影 querySer=DataDF.loc[:,'spe']>200 #应用查询条件 print('删除异常值前:',DataDF.shape) DataDF=DataDF.loc[querySer,:] print('删除异常值后:',DataDF.shape) #DataDF.to_csv('gps-ugly.csv')
这件事也还算有了后续
在参与一个数据挖掘挑战赛时需要进行的数据处理前置:比赛会给定一个csv文件,里面标注了部分图像识别的数据(yolov5),我们需要将这个csv里有用的信息提取出来,根据每个图片的框框分别创建[追加] 一个txt文档,以便进行后续神经网络的训练。
import pandas as pd import numpy as np pt = {6: 0, 7: 1, 8: 2, 9: 3, 10: 4, 25: 5, 41: 6, 105: 7, 110: 8, 115: 9, 148: 10, 156: 11, 222: 12, 228: 13, 235: 14, 256: 15, 280: 16, 310: 17, 387: 18, 392: 19, 394: 20, 398: 21, 401: 22, 402: 23, 430: 24, 480: 25, 485: 26, 673: 27} file_name = '图片虫子位置详情表.csv' df = pd.read_csv(file_name, names=range(9), header=None, encoding='ANSI') df = df.loc[1:, 1:] df.columns = ['序号', '文件名', '虫子编号', '虫子名', 'x', 'y', '左上', '右下'] # 添加列名 pd.set_option('display.max_rows', 10) # 打印行数 np.set_printoptions(threshold=1e6) # 设置输出 # print(df.dtypes)#查看数据类型 querySer = df.loc[:, '虫子编号'] != '0' # 应用查询条件 print('处理前:', df.shape) df = df.loc[querySer, :] print('处理后:', df.shape) print(df) # 筛掉无虫数据结果临时文件 # df.to_csv('ans.csv') for index, row in df.iterrows(): print(row["文件名"], row["虫子名"]) name = row["文件名"][0:-4] + ".txt" # 根据左上右下坐标计算宽和高 x1, y1 = str(row['左上']).split(',') x2, y2 = str(row['右下']).split(',') # 创建追加txt文件 with open('./ans/' + name, 'a') as fp: a = float(row['x']) / 5472 b = float(row['y']) / 3648 c = (float(x2) - float(x1)) / 5472 d = (float(y2) - float(y1)) / 3648 #归一化操作 fp.write(str(pt[int(row['虫子编号'])])) fp.write(" ") fp.write(str(a)) fp.write(" ") fp.write(str(b)) fp.write(" ") fp.write(str(c)) # 宽 fp.write(" ") fp.write(str(d)) # 高 fp.write("\n")
从实例数据的图片中分离出已经带有标记的图片:
import pandas as pd import numpy as np from shutil import copyfile import os,sys file_name = '../附件2/图片虫子位置详情表.csv' df = pd.read_csv(file_name, names=range(9), header=None, encoding='ANSI') df = df.loc[1:, 1:] df.columns = ['序号', '文件名', '虫子编号', '虫子名', 'x', 'y', '左上', '右下'] # 添加列名 pd.set_option('display.max_rows', 10) # 打印行数 np.set_printoptions(threshold=1e6) # 设置输出 querySer = df.loc[:, '虫子编号'] != '0' df = df.loc[querySer, :] ls = [] for index, row in df.iterrows(): str = row["文件名"] if str not in ls: #判重,避免重复删除导致报错。 ls.append(str) for i in ls: path1 = "./"+i #需要复制的文件所在地址 path2 = "../有标记的图片/"+i #目标地址 copyfile(path1, path2) os.remove(path1)
重载解决乱码问题:
import torch cx = torch.load('best.pt') cx['model'].names = ['大螟', '二化螟', '稻纵卷叶螟', '白背飞虱', '褐飞虱属', '地老虎', '蝼蛄', '粘虫', '草地螟', '甜菜夜蛾', '黄足猎蝽', '八点灰灯蛾', '棉铃虫', '二点委夜蛾', '甘蓝夜蛾', '蟋蟀', '黄毒蛾', '稻螟蛉', '紫条尺蛾', '水螟蛾', '线委夜蛾', '甜菜白带野螟', '歧角螟', '瓜绢野螟', '豆野螟', '石蛾', '大黑鳃金龟', '干纹冬夜蛾'] torch.save(cx, 'best.pt') # 重新保存文件
从训练结果lables导出结果(填表):
#%% 导出结果——问题二三的结果样例 import pandas as pd import numpy as np import os,codecs from csv import reader,writer pt = {0: 6, 1: 7, 2: 8, 3: 9, 4: 10, 5: 25, 6: 41, 7: 105, 8: 110, 9: 115, 10: 148, 11: 156, 12: 222, 13: 228, 14: 235, 15: 256, 16: 280, 17: 310, 18: 387, 19: 392, 20: 394, 21: 398, 22: 401, 23: 402, 24: 430, 25: 480, 26: 485, 27: 673} path = "./labels" #文件所在地址 file_list = os.listdir(path) f1 = codecs.open('./problem_2.csv','w','gbk') w1 = writer(f1) w1.writerow(['序号','文件名','虫子编号','中心点x坐标','中心点y坐标','左上角x坐标','左上角y坐标','右下角x坐标','右下角y坐标']) f2 = codecs.open('./problem_3.csv','w','gbk') w2 = writer(f2) w2.writerow(['序号','文件名','虫子编号','数量']) num = {} for fn in file_list: name=fn[0:-4]+'.jpg' f = open('./labels/'+fn,encoding='UTF-8') while True: line = f.readline() if line: ID,x,y,w,h = line.split() x,y,w,h = round(float(x)*5472),round(float(y)*3648),round((float(w)/2)*5472),round((float(h)/2)*3648) zs_x,zs_y = x-w,y-h yx_x,yx_y = x+w,y+h bh = pt[int(ID)] w1 = writer(f1) w1.writerow(['',name,bh,x,y,zs_x,zs_y,yx_x,yx_y]) if bh in num: num[bh] = num[bh] + 1 else: num[bh] = 1 else: for k in num: w2 = writer(f2) w2.writerow(['',name,k,num[k]]) break f.close() f1.close() f2.close()
应队友写论文需求,打了个表。新增知识点主要涉及到了设置打印行数与列数、增加列、删除列。
import pandas as pd import numpy as np pt = {6: 0, 7: 1, 8: 2, 9: 3, 10: 4, 25: 5, 41: 6, 105: 7, 110: 8, 115: 9, 148: 10, 156: 11, 222: 12, 228: 13, 235: 14, 256: 15, 280: 16, 310: 17, 387: 18, 392: 19, 394: 20, 398: 21, 401: 22, 402: 23, 430: 24, 480: 25, 485: 26, 673: 27} file_name = '图片虫子位置详情表.csv' df = pd.read_csv(file_name, names=range(9), header=None, encoding='ANSI') df = df.loc[1:, 2:8] df.columns = ['文件名', '虫子编号', '虫子名称', '中心点x坐标', '中心点y坐标', '左上角坐标','右下角坐标'] # 添加列名 pd.set_option('display.max_rows', 100) # 打印行数 pd.set_option('display.max_columns', 100) # 设置显示最大列数 pd.set_option('display.width', 10000) # 设置字符显示宽度 #np.set_printoptions(threshold=1e6) # 设置输出 pd.set_option('display.unicode.ambiguous_as_wide',True) # 将模糊字符宽度设置为2 pd.set_option('display.unicode.east_asian_width',True) # 检查东亚字符宽度属性 np.set_printoptions(linewidth=100, suppress=True) querySer = df.loc[:, '虫子编号'] != '0' df = df.loc[querySer, :] x1,y1,x2,y2=[],[],[],[] for index, row in df.iterrows(): a, b = str(row['左上角坐标']).split(',') x1.append(a) y1.append(b) a, b = str(row['右下角坐标']).split(',') x2.append(a) y2.append(b) df['左上角x坐标']=x1 df['左上角y坐标']=y1 df['右下角x坐标']=x2 df['右下角y坐标']=y2 df=df.drop(['左上角坐标','右下角坐标'], axis=1,inplace=False) #df