datacombo重复值的处理_【数据预处理】python旅游网站数据清洗实践

a655f4ec911d3961a38c2c701cd8e452.png
利用python进行数据预处理,不能离开pandas,我看过的教程在介绍数据预处理时的流程都是:numpy介绍、pandas介绍、数据预处理。
对于numpy和pandas,我的经验是不用刻意去记,知道他们分别是干嘛的(别人问到不至于说不出来),使用方法要有个印象,然后实际运用中有需要再去查就可以。

numpy:科学计算

pandas:基于numpy,非常适合于数据预处理。

本案例的数据预处理思路:【重点】重复值、异常值、缺失值;【细节】格式清洗、数据提炼(在该案例中没有进一步数据提炼)。

1. 导入数据,并查看数据的基本情况:

import 

a02be4a18771f7749d45e357b17e0d84.png
数据框,输出的详细信息截图省略

从这一步的结果来看,可以初步判定:

  1. 数据存在缺失值(总数据共5100条,但是出发地、目的地、价格、节省四个变量下数据量都小于5100)。
  2. 数据可能存在异常值(描述性统计中,价格最大值达到179500,不符合实际情况,需要后续标准分判断是否属于异常值)。
  3. 数据可能存在重复。
  4. 数据的列名有些存在空格,有些没有空格,需要对列名进行格式化,方便后续调用。

2.【细节】预处理:数据框列名格式化

DataFrame.columns = [x.strip() for x in DataFrame.columns]

可将列名前后的空格去除。

3.【重点】数据去重

DataFrame.duplicated() 返回每一行的True or False,实际上对去重没有什么帮助。
数据去重暂时只需要记住两个有用的
DataFrame.duplicated().sum()  # 看一下重复值有多少
DataFrame.drop_duplicates()  # 直接去重

去重后,100条重复数据被删除,剩余5000条。

450257315ee9f65c59403694753c4294.png
【NOTE】数据去重后,原来的索引会出现间断!所以需要进行索引重构!
DateFrame.index = range(data.shape[0])  # 重新生成0-4999的索引号

4.【重点】异常值处理

异常值的处理需要考虑具体的业务环境,不同业务环境对异常值的定义不同
在该案例中,重点关注的是“价格”和“节省”两个数值型变量下的异常值
在该案例中,将“价格”列做标准分,标准分绝对值大于3的视为异常值,同时“节省”列的值大于“价格”列的值也视作异常
将满足异常判定条件的数据进行删除
# 在数据框中寻找满足上述条件的数据
std_score = (DataFrame['col_name']-DataFrame['col_name'].mean())/DataFrame['col_name'].std()
DataFrame[std_score.abs() > 3]  # 第一个条件
DataFrame[data['节省'] > data['价格']] # 第二个条件
pd.concat([DataFrame[std_score.abs() > 3], DataFrame[data['节省'] > data['价格']]])  # 合并两个条件
# 获取异常数据的index
del_index = pd.concat([DataFrame[std_score.abs() > 3], DataFrame[data['节省'] > data['价格']]]).index
# 删除
DataFrame.drop(del_index, inplace=True)

6cae4d8f2d8e8b5396ca2e039b8042e8.png
存在异常的数据(4条)删除后剩余4996条数据

5.【重点】缺失值的处理

对于缺失值具体情况的查看,掌握两个代码模板即可
DataFrame.isnull().sum()  # 查看数据框总体缺失情况
DataFrame[DataFrame['col_name'].isnull()] # 某列缺失值的具体情况

cebda0a68149308e6ed7bd8f2936abf0.png
“价格”列存在缺失的数据框(部分)
该案例中,对于“价格”和“节省”列的缺失值,却用平均值补全
缺失值补全掌握一个代码模板即可
DataFrame['col_name'].fillna(round(DataFrame['col_name'].mean()), inplace=True)
该案例中,对于“出发地”和“目的地”列的缺失值,可以用数据提炼的方法在其他列寻找缺失项(路线名字符串中包含出发地和目的地)
# 使用loc相对位置找到缺失值的具体位置
DataFrame.loc[DataFrame['出发地'].isnull(), '出发地']
# "路线名"列数据提炼
[str(x)[:2] for x in DataFrame.loc[DataFrame['出发地'].isnull(), '路线名']]
# 合起来就是:
DataFrame.loc[DataFrame['出发地'].isnull(), '出发地'] = [str(x)[:2] for x in DataFrame.loc[DataFrame['出发地'].isnull(), '路线名']]
# 对于“目的地”缺失值的补全同上,不赘述。

472d013d30042f963cac94abdb6fa831.png
最后在对缺失值进行统计,发现已经不存在缺失情况

6.【细节】数据提炼

对于数据框中剩余的列,还可能包含着对分析有用的信息,比如“酒店列”包含着酒店评分等。
对于这些数据,可以使用正则表达式进行信息提炼,将提炼后的信息生成新的变量列加入数据框。

···2020.2.11更新补充···

在实际业务中,原始数据的缺失值可能会被标记为0或999之类的数值,导入pandas进行数据预处理时,可以使用DataFrame.replace("自定义缺失值", np.nan)替换为pandas可识别的缺失值类型。
对于缺失值的处理,最好是不要直接删除含缺失值的数据,而是要尽可能保留数据信息。若要删除缺失值,使用DataFrame.dropna()

a867a927f1e61e057a06aa8ea70be429.png

学习要有输入更要有输出。

该文章作为自己的学习输出,可能有些地方是按照自己能看懂的方式写的,模糊的地方还请见谅。

欢迎交流和指教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值