数据操作及清洗

数据操作

read_csv		# 从文件、url或者文件型对象读取分割好的数据,逗号是默认分隔符
read_excel		# 从Excel的XLS或者XLSX文件读取表格信息
read_hdf		# 读取pandas写的HDF5文件
read_html		# 从HTML文件中读取所有表格数据
read_json		# 从json字符串中读取数据
read_msgpack	        # 二进制格式编码的pandas数据
read_sql		# 将SQL查询结果(SQLAlcemy)读取为pandas的DataFrame


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# jupyter notebook打开的话需要运行这一行代码,在cell中显示图形

# 读取文件的时候直接指定类名称names参数
df = pd.read_csv("E:/Test/test.csv",names=['数','据','分','析','真','好','玩'])
df

数据清洗概念

数据清洗的工作节点
	在你获取到第一手数据之后就应该进行数据清洗的操作
   
脏数据
	残缺数据、错误数据、重复数据、不符合规则的数据……
    
干净数据
	已经处理完毕没有脏数据的数据,可以直接带入模型的数据
    
数据清洗的大致步骤
1.数据的读取
2.数据的探索
3.数据简单处理
4.重复值处理
5.缺失值处理
6.异常值处理
7.文本字符数据处理
8.时间序列处理
# 上述步骤3~8有时候不需要按照固定的顺序来,并且也不是所有的数据都需要经历上述所有的清洗操作

数据清洗案例

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# 导入数据集及初步探索
df = pd.read_csv('qunar_freetrip.csv',index_col=0)
df.head()  # 简单查看数据形状
df.shape  # 数据探索
df.info()  # 查看数据结构(如是否有缺失值,数据类型等)
df.describe()  # 查看快速统计(只展示数值型数据的统计)

# 简单数据处理
del df['Unnamed: 0']  # 删除无用的列
df.columns  # 查看列名称 注意这里可能会出现列名称多空格的情况导致无法直接点出
df.head(2)  # 对比列名称是否有空格
# 移除列名称里面多余的空格
col = df.columns.values  # 将列名变成支持for循环的ndarray
# for循环加strip移除字符串首尾的空格
df.columns = [i.strip() for i in col]
df.columns

# 重复值处理
duplicated()函数:查看并显示数据表中的重复值
1.当两条记录中所有的数据都相等的时候才会判定为重复值# 异常值处理
df.describe()  # 观察可能的异常值
# 1.找出价格的异常值
res = (df['价格']-df['价格'].mean())/df['价格'].std()
# 找出大于三倍标准差的数据就是异常值
df[res.abs()>3]
# 2.找出节省的异常值(价格肯定要比节省的大)
sum(df.价格 > df.节省)
df[df.节省>df.价格]
# 1.2删除1和2中出现的异常数据
先将1和2的异常数据拼接起来获取到数据的行索引
res1 = pd.concat([df[df.节省>df.价格],df[res.abs()>3]])
delete_line = res1.index
df.drop(delete_line,inplace=True)
2.函数支持从前往后和从后往前两种重复值查找模式(默认是从前往后进行查看和判断)
# 返回布尔值数据
df.duplicated()  
# 查看所有的重复值数据 利用布尔值索引
df[df.duplicated()]
# 统计重复值的数量
df.duplicated().sum()
# 删除重复值 drop_duplicates()
df.drop_duplicates(inplace=True)
# 确认删除操作
df.shape
# 重置行索引(动了原数据集就需要考虑是否重置行索引)
df.index = range(df.shape[0])

# 异常值处理
df.describe()  # 观察可能的异常值
# 1.找出价格的异常值
res = (df['价格']-df['价格'].mean())/df['价格'].std()
# 找出大于三倍标准差的数据就是异常值
df[res.abs()>3]
# 2.找出节省的异常值(价格肯定要比节省的大)
sum(df.价格 > df.节省)
df[df.节省>df.价格]
# 3.删除1和2中出现的异常数据
# 先将1和2的异常数据拼接起来获取到数据的行索引
res1 = pd.concat([df[df.节省>df.价格],df[res.abs()>3]])
delete_line = res1.index
df.drop(delete_line,inplace=True)

# 缺失值处理
df.isnull().sum()  # 快速统计每列缺失值数量
# 针对出发地的缺失值可能在路线里面有答案 所以需要自己查找并填充
df[df.出发地.isnull()]
df.loc[df.出发地.isnull(),'出发地'] = [str(i)[:2] for i in df.loc[df.出发地.isnull(),'路线名']]
# 针对目的地的缺失值同样也可以在路线中找到答案
df[df.目的地.isnull()]
df.loc[df.目的地.isnull(),'目的地'] = str(df.loc[df.目的地.isnull(),'路线名'].values)[5:7]
# 价格的缺失值  用价格的均值填充  round后可以指定要保留的小数位数
df['价格'].fillna(round(df['价格'].mean(),0),inplace=True)
# 处理节省缺失值  用节省的均值填充
df['节省'].fillna(round(df['节省'].mean(),0),inplace=True)
# 验证
df.isnull().sum()

# 处理文本型数据
正则表达式:通过一系列特殊符号在字符串中匹配出符合正则表达式的内容
df.head()  # 观察每条路线的游玩时间(即几日几夜)、酒店评分
# 添加一列酒店评分数据
df['酒店评分'] = df.酒店.str.extract('(\d\.\d)分/5分',expand=False)
"""
expand=False		返回index/series
expand=True			返回DataFrame
"""
# 添加酒店等级
df['酒店等级'] = df.酒店.str.extract(' (.+) ',expand=False)
# 添加游玩时间
df['天数'] = df.路线名.str.extract('(\d+)天\d晚',expand=False)
posted @ 2020-09-13 17:43  最冷不过冬夜  阅读(398)  评论(0编辑  收藏  举报