Python 数据清洗及预处理常用代码整理

注意代码中LONGITUDE、LATITUDE、SPEED、DIRECT等属于博主做交通数据处理时的残留模板。如要自定义使用替换为使用场景下的对应词句即可
import pandas as pd
import numpy as np
import matplotlib.pyplot as pit
# %matplotlib inline

import csv
import codecs
import openpyxl


# 为添加列标题【如果原始数据没有】
def formulate(file_name):
    df = pd.read_csv(file_name, header=None)
    tt = ["ID_0", "ID_1", "ID_2", "EMPTY", "LONGITUDE", "LATITUDE", "SPEED", "DIRECT", "STATUS", "CPS_Y", "CPS_MON",
          "CPS_D", "CPS_H", "CPS_MIN", "CPS_S", "CARTYPE"]
    # R2G = pd.read_csv(RF_PATH, header=None)
    insertRow = pd.DataFrame([tt])
    # R2G = pd.concat([instertRow, R2G], ignore_index = True)
    R2G = insertRow.append(df, ignore_index=True)
    R2G.to_csv(file_name, header=None, index=None)
    df = pd.read_csv(file_name, index_col=0)


# file_name为写入CSV文件的路径,datas为要写入数据列表
def data_write_csv(file_name, datas):
    file_csv = codecs.open(file_name, 'w+', 'utf-8')  # 追加
    writer = csv.writer(file_csv, delimiter=' ', quotechar=' ', quoting=csv.QUOTE_MINIMAL)
    for data in datas:
        writer.writerow(datas)
    print("保存文件成功,处理结束")


# 同上存储为text格式
def text_save(filename, data):
    file = open(filename, 'a')
    for i in range(len(data)):
        s = str(data[i]).replace('[', '').replace(']', '') 
        # 去除[],这两行按数据不同,可以选择
        s = s.replace("'", '').replace(',', '') + '\n'  
        # 去除单引号,逗号,每行末尾追加换行符
        file.write(s)
    file.write(str(data))
    file.close()
    print("保存文件成功")


# -------------------------------------------------------------【设置pd设定】

# 显示所有列
pd.set_option('display.max_columns', None)

# 显示所有行
pd.set_option('display.max_rows', None)

# 设置value的显示长度为100,默认为50
pd.set_option('max_colwidth', 100)

# -------------------------------------------------------------【数据基础信息】
filename = '输入需要预处理的数据所在的文件地址'

# 如果原始数据没有列标题启用添加【注意自定义函数设定】
# formulate(filename)

df = pd.read_csv(filename, header=None)
# 查看数据特征
print("数据特征:(数据总数【行】, 属性个数【列】)")
print(df.shape)

# 查看数据结构
print("数据结构:")
print(df.info())

# 查看详细描述【数值型数据】
print("数据详细描述:")
print(df.describe())

# 描述结果输出csv
df.describe().to_csv('./output.csv')
map_point = df[['LONGITUDE', 'LATITUDE']]
map_point.to_csv('./output_points2.csv')

# 取数据项名称
COL = df.columns.values
print(COL)

# 列表代码推导式循环COL中数据项名称进行去空格操作【strip函数一次只能处理一个数据】
df.columns = [x.strip() for x in COL]

# -------------------------------------------------------------【重复值处理】

# 重复值检查 duplicated() 返回布尔型数据,告知重复值的位置
# 注意:当两条数据各项完全重复时才会认定为重复值,默认执行从前向后的重复值查找,所以重复值标记会在后重复数据中显示为TRUE
print(df.duplicated())

# 重复值数据的个数
print("重复值数据量统计:")
print(df.duplicated().sum())

# 删除重复值数据【inplace=TRUE表示直接在原始数据上进行删除操作
df.drop_duplicates(inplace=True)

# 修改原始数据后可能需要重置index下标排序以便后续针对特殊数据定位
df.index = range(df.shape[0])

# -------------------------------------------------------------【异常值处理】

# 以三倍标准差为衡量标准找出异常值
sta = (df['DIRECT'] - df['DIRECT'].mean()) / df['DIRECT'].std()
print(sta)

# 保存sta数据
text_save('./output.txt', sta)

# 筛选定位出大于三倍标准差的异常数据和其index  实际index = 输出结果 + 2
df[sta.abs() > 3]
print(df[sta.abs() > 3])
print(df[sta.abs() > 3].index)
print(sta)

# 建模时通常删除异常值,但异常值也蕴含业务价值 concat可以合成提取
delindex = pd.concat([df[sta.abs() > 3]]).index
print("异常值index定位:")
errorIndex = df[sta.abs() > 3].index
print(errorIndex)

# inpalce=True时直接在原始数据上进行修改
df.drop(errorIndex, inplace=True)
df.drop(errorIndex)

# -------------------------------------------------------------【缺失值处理】
# 查找是否存在缺失值,并统计缺失数量
print("缺失值数据量:")
print(df.isnull().sum())

# 若存在缺失值
# ①利用数据内部的关联直接替代缺失数据
# df.object_name.isnull()定位缺失值所在数据对象
df.loc[df.SPEED.isnull(), 'SPEED'] = [str(x)[:6] for x in df.loc[df.SPEED1.isnull(), 'SPEED1']]

# 此处是将对应可用于填补缺失的数据通过values取出后str化为字符串列表
# 进行对应index 5-6位置数据的提取
df.loc[df.AREA.isnull(), 'AREA'] = str(df.loc[df.AREA.isnull(), 'AREADETAIL'].values)[5:6]

# ②通过fillna进行缺失值填补
df['SPEED'].fillna(round(df['SPEED'].mean(), 0), inplace=True)

# 【, a】的作用
print("[xxx, 0]时结果如下:")
print(round(df['SPEED'].mean(), 0))
print("[xxx, 1]时结果如下:")
print(round(df['SPEED'].mean(), 1))

# 处理文本型数据部分省略

你可能感兴趣的:(Python数据处理,python,数据分析,大数据,经验分享,其他)