爬取得旅游网站数据
# -*- encoding: utf-8 -*-
"""
@File : homework_5_data_clean.py
@Time : 2019/9/17 22:05
@Author : chen
"""
import numpy as np
import pandas as pd
df = pd.read_csv("qunar_freetrip.csv", index_col=0)
print(df)
print(df.columns)
col = df.columns.values
print(col[0].strip()) # 去除空格
df.columns = [x.strip() for x in col]
print(df.columns.values)
# 重复值的处理
# duplicated()显示重复值,返回的是一个布尔类型的数据类型 显示为True的代表数据重复
# drop_duplicated():删除重复值
print("重复数据多少组:",df.duplicated().sum()) # 重复数据多少组
print(df.duplicated()) # 显示重复数据
print(df.drop_duplicates(inplace=True)) # 删除重复数据
print(df.drop_duplicates().sum())
print(df.shape)
df.index = range(df.shape[0])
print(df.index)
### 异常值处理
print("########################################################")
'''
主要处理’价格‘和’节省‘两个字段
需要针对不同的项目进行处理
'''
print(df.describe()) # 只有数字类型显示
print(df.describe().T) # 转置操作
print("价格标准差:", df["价格"].std()) # 价格标准差
print(df["价格"]-df["价格"].mean())
# 标准差标准化处理:也叫标准分数
sta = (df["价格"]-df["价格"].mean())/df["价格"].std()
print("标准差标准化处理:", sta)
#
print("*********异常数据显示************")
print(df[sta.abs() > 3]) # 查出来标准分数 >3 的异常数据
print(df[df.节省 > df.价格]) # 节省钱数大于自身价格的异常数据
print(pd.concat([df[df.节省 > df.价格], df[sta.abs() > 3]])) # 合并上面两个异常数据
del_index = pd.concat([df[df.节省 > df.价格], df[sta.abs() > 3]]).index # 得到异常数据的索引值
df.drop(del_index, inplace=True) # 不显示为True的数据,删除异常
print(df.shape)
### 缺失值处理
print("*******************缺失值处理部分**********************")
'''
df.isnull() 查看缺失值
df.notnull() 查看不是缺失值的
df.dropnd() 删除缺失值
df.fillna() 填补缺失值
'''
print(df.isnull())
print(df.isnull().sum())
print(df[df.出发地.isnull()]) # 出发地缺失数据
print(df[df.价格.isnull()]) # 价格缺失数据
print(df.loc[df.出发地.isnull(), '出发地']) # 单独获取出发地为空的数据,返回出发地
print(df.loc[df.出发地.isnull(), '路线名']) # 获取出发地为空的数据,返回路线名
df.loc[df.出发地.isnull(), '出发地'] = [str(x)[:2] for x in df.loc[df.出发地.isnull(), '路线名']] # str(x)[:2]字符串从0到2 提取出来,即出发地的城市名称,2个汉字,赋值到出发地为空的
print("出发地为空的数据:", df[df.出发地.isnull()]) # 出发地为空的数据
print("出发地为空的数据数目是多少:",df.出发地.isnull().sum())
# 目的地异常数据的问题
print("目的地异常数据:", df[df.目的地.isnull()])
print("目的地异常数据str类型数据返回:", str(df.loc[df.目的地.isnull(), '路线名'].values))
print("目的地异常数据提取目的地名称:", str(df.loc[df.目的地.isnull(), '路线名'].values)[5:7])
df.loc[df.目的地.isnull(),"目的地"] = str(df.loc[df.目的地.isnull(), '路线名'].values)[5:7] # 数据替换
# 处理价格
print(df["价格"].mean())
print(round(df["价格"].mean(), 0))
print(df["价格"].fillna(round(df["价格"].mean(), 0), inplace=True))
print(df["节省"].fillna(round(df["节省"].mean(), 0), inplace=True))
print("缺失数据的数目为0,代表队缺失值处理完成:", df.isnull().sum()) # 缺失数据的数目为0,代表队缺失值处理完成
# 提取酒店评分数据
df["酒店评分"] = df.酒店.str.extract('(\d\.\d)分/5分')
print(df["酒店评分"])
# 提取酒店等级
df["酒店等级"] = df.酒店.str.extract(' (.+ )')
print(df["酒店等级"])
# 提取天数
df["天数"] = df.路线名.str.extract('(\d+)天\d晚')
print(df["天数"])
print(df.head())