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

  

 

posted @ 2021-04-14 09:29  anyiya  阅读(68)  评论(0编辑  收藏  举报