【学习笔记】Python进行数据清洗

2023-11-12

写在前面的话

最近看了一个up主讲基本数据清洗操作,觉得非常好,链接如下:

【Python 数据清洗】用Python给数据洗澡澡~ |数据分析|数据清洗|数据预处理|_哔哩哔哩_bilibili

 评论区也有原数据集和相关代码的链接(不是广告),下面就浅浅记一下自己的学习笔记。除此之外,up主的缺失值处理是直接用均值进行替代,个人觉得不是很严谨,所以替换成了随机森林算法填补缺失值。

需要注意的是,正常的顺序应该是先进行缺失值处理,再进行文本提取、时间处理等操作,但是因为我用随机森林的时候需要用文本提取来创造新变量,所以把两者顺序调转了一下。


目录

1. 读取数据

2. 数据探索与描述

3. 数据简单处理

4. 文本字符串/时间格式序列处理

5. 缺失值/异常值处理

6. 总结(思维导图)


1. 读取数据

import pandas as pd
df = pd.read_csv(".\qunar_freetrip.csv",index_col = 0)
df.head()

2. 数据探索与描述

df.info()
df.describe()
df.shape


3. 数据简单处理

# 通过该命令发现列名有空格
col = df.columns.values

#进行清洗
df.columns = [x.strip() for x in col]
df.columns

# 重复值
df.duplicated() #返回布尔型数据,告诉重复值的位置
df[df.duplicated()] #返回重复数值
df.duplicated().sum()  #返回重复值数量
df.drop_duplicates(inplace = True) # 删除重复值,inplace=True表示在原数据集上进行操作


# 需要注意的是去重之后需要索引重置
df.reset_index()

4. 文本字符串/时间格式序列处理

# 正则提取酒店评分等信息
# ''里面是规则;()里面是提取内容
import re

df['酒店评分'] = df['酒店'].str.extract('(\d\.\d)分/5分',expand = False)
df['酒店等级'] = df['酒店'].str.extract(' (.+) ', expand = False)
df['time_start'] = [x.split('-')[0].strip() for x in df['去程时间']]
df['time_end'] = [x.split('-')[1].strip() for x in df['去程时间']]
df['天数'] = df['房间'].str.extract('\d+间(\d+)晚', expand = False)
df['航空公司'] = [re.findall(r'[\u4e00-\u9fff]+',x)[0] for x in df['去程航司']]


# 时间格式处理
from datetime import datetime as dt
df['start'] = [dt.strptime(x,'%H:%M') for x in df['time_start']]
df['end'] = [dt.strptime(y,'%H:%M') for y in df['time_end']]
df['minute'] = [round(x.seconds/60,0) for x in (df['end'] - df['start'])]
df = df.drop(df[['end','start']],axis = 1)

5. 缺失值/异常值处理

#(1)异常值
## (a)异常值检测
### motivation: 对缺失值进行处理的时候需要考虑去掉异常值
df.describe().T

### 发现最大值比较离谱,现在对异常值进行定义,在三倍标准差之外的是异常值
sta = (df['价格']-df['价格'].mean())/df['价格'].std()

### 找出价格异常值
df[sta.abs()>3]  #此时需要和业务进行了解,这个异常值的原因,是输入错误还是

### 找出节省异常值
df[df['价格']<df['节省']]


## (b) 异常值处理 
### 对于建模来说,异常值要去除;但是对于业务来说,异常值中会包含业务增长点
deindex = pd.concat([df[df['价格']<df['节省']],df[sta.abs()>3]]).index #获取异常值的index
df.drop(deindex, inplace = True)  #
df = df.reset_index()


# 缺失值
## (a)缺失值检测
### 看缺失值一共有多少
df.isnull().sum()

### 查看具体确实数值,挨个看缺失值的模式
df[df.出发地.isnull()] #比如出发地,可以看到路线名中包含了出发地和目的地
df.loc[df.出发地.isnull(), '出发地'] = [str(x).split('-')[0] for x in df.loc[df.出发地.isnull(), '路线名']]
df.loc[df.目的地.isnull(), '目的地'] = [str(x).split('-')[1][:2] for x in df.loc[df.目的地.isnull(), '路线名']]


## (b) 缺失值处理
null_index = df[df['价格'].isnull()].index #记录一下空缺值索引,这样后面可以进行对比

### 方法一:直接删除缺失值
df1 = df.copy()  #因为要讨论多种方法,所以复制一下原表
df1.dropna(axis=0,how='any',inplace=True) # inplace是否原地替换
df1.shape


### 方法二:取均值
# 思考:直接填充均值是否太随便了,能不能用【出发地,目的地,去程航司,时间,去程方式】进行预测
df2 = df.copy()
df2[df2['价格'].isnull()]
df2['价格'].fillna(round(df2['价格'].mean(),0), inplace = True)
df2['节省'].fillna(round(df2['节省'].mean(),0), inplace = True)


### 方法三:随机森林进行填补

null_index = df[df['价格'].isnull()].index #记录一下空缺值索引,等会可以看一下拟合结果是否离谱

df3 = df.copy()
#生成虚拟变量
dummy = pd.get_dummies(df3[['出发地','目的地','去程方式','航空公司']], prefix=None, prefix_sep='_')
dummy['key']=[x for x in range(len(dummy))]
#获取数值变量
df_sub = df3[['价格','minute']]
df_sub['key']=[x for x in range(len(df_sub))]
#合并
df_merge = pd.merge(df_sub,dummy,on=['key','key'])

from sklearn.ensemble import RandomForestRegressor
# 随机模型预测
# 分成已知和未知价格数据
known_price = df_merge[df_merge['价格'].notnull()].values
unknown_price = df_merge[df_merge['价格'].isnull()].values

y = known_price[:,0]
X = known_price[:,1:]

#进行拟合
model = RandomForestRegressor(random_state=0, n_estimators=2000,n_jobs=-1)
model.fit(X,y)

#预测
predictedPrice = model.predict(unknown_price[:, 1:])
df3.loc[(df3['价格'].isnull()),'价格'] = predictedPrice

# 对比方法2和3
df2['key'] = [x for x in range(len(df2))]
df3['key'] = [x for x in range(len(df3))]
comparison = pd.merge(df2[['key','价格']],df3[['key','价格']],on=['key','key'])
comparison.iloc[null_index,:]

这里的数值处理推荐这个博客:【Python数据分析基础】: 数据缺失值处理 - 码农教程

以及推荐一个jupyter快捷键博客:https://blog.csdn.net/baidu_26137595/article/details/124063900

6. 总结(思维导图)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【学习笔记】Python进行数据清洗 的相关文章

随机推荐

  • 2023Go面试问答_Go Runtime

    Goroutine 定义 Goroutine 是一个与其他 goroutines 并行运行在同一地址空间的 Go 函数或方法 一个运行的程序由一个或更多个 goroutine 组成 它与线程 协程 进程等不同 它是一个 goroutine
  • 惯量比多少合适_惯量比

    电机的负载惯量估计方法 提供了一种电机的负载惯量估计方法 即便在电机的齿槽转矩较大或在负载机械系统中出现共振的时候 这种方法也能够 估计负载惯量 在加速反馈信号中检测振动 当检测到的振动等于或高于预定水平的时候 用系数 乘以估计惯量增益 其
  • 机器学习复习模拟题

    Q1 在回归模型中 下列哪一项在权衡欠拟合 under fitting 和过拟合 over fitting 中影响最大 A 多项式阶数 B 更新权重 w 时 使用的是矩阵求逆还是梯度下降 C 使用常数项 答案 A 解析 选择合适的多项式阶数
  • <刷题笔记>408计算机学科专业基础综合_操作系统_第一章_计算机系统概述_第一篇

    操作系统是一种系统软件 通用软件 普通大众都会使用的 如office 迅雷 专用软件 某些领域的专业人士使用的 如AutoCAD logic Pro 系统软件 计算机中负责管理 运行 控制和维护计算机系统资源的软件 如 操作系统 数据库管理
  • ORACLE updata是提示违反唯一约束条件

    如图所示 使用updata语句时提示违反唯一约束条件 语句如下 update table name set param1 xxx param2 xxx where param4 xxx 解决办法 一 能用Navicat for Oracle
  • wow.js

    一 页面在向下滚动的时候 有些元素会产生细小的动画效果 虽然动画比较小 但却能吸引你的注意 刚知道wow js这个插件 之前写的类似滚动时页面效果都是自己用jQuery写的 现在有了插件 开发更加快捷有效了 演示及下载地址 http www
  • PermissionX开源框架的使用

    背景 动态申请权限是一件特别繁琐的事情 涉及的权限一多 就让人头疼 Android提供给我们的运行时权限申请的API并不是很友好 比如我们需要动态申请打电话的功能 除了在roidManifest xml中声明权限之外 还要在执行拨打电话操作
  • 报错:Avoided redundant navigation to current location: “/login“.完美解决

    需求 登陆之后才能查看主页面 否则跳转至登录页 遇到的问题 一开始是打算直接在拦截器跳转路由的 发现会报错Avoided redundant navigation to current location login 后来灵机一动 用了全局路
  • vue报错:regeneratorRuntime is not defined

    报错原因是使用了 async await 没有配置 babel 导致语法不支持 所以才会报错 首先安装以下依赖 npm install babel plugin transform runtime save dev 或 npm i save
  • 【AnyQ】如何添加插件

    一 已有插件 字典插件 此类插件继承DictInterface接口 哈希词典 HashAdapter
  • SyntaxWarning: name 'x' is assigned to before global declaration global color Python

    SyntaxWarning name x is assigned to before global declaration global color Python 这种报错很大原因是在同一个函数重复使用了global 声明 举个例子 x 0
  • LiveData详细分析2

    一 LiveData是什么东西 1 基于观察者设计模式 LiveData是一种持有可被观察数据的类 被观察者 LiveData需要一个观察者对象 一般是Observer类的具体实现 当观察者的生命周期处于STARTED或RESUMED状态时
  • linux用dd命令刻录u盘,巧用linux dd命令刻录启动U盘

    dd命令是Linux UNIX 下的一个非常有用的命令 作用是用指定大小的块拷贝一个文件 并在拷贝的同时进行指定的转换 大部分用户只知道dd命令的这个用处 殊不知dd命令做usb启动盘也十分方便 下面就让我们一起来看看dd命令是如何运用到刻
  • 聊聊限流、熔断和降级

    背景 分布式系统中的调用关系错综复杂 如何保障整个系统平稳运行则显得尤为重要 限流 熔断和降级应运而生 限流 为了保障下游服务稳定性 通常会提前预估调用QPS 一旦超过预估QPS则可以进行限流 拒绝超出预估的请求 常见的限流算法有固定窗口
  • python插入单条、多条dict类型数据到clickhouse

    比如一个数据库名字叫test 表名称叫just check 插入单条dict数据 import clickhouse connect client clickhouse connect get client host 127 0 0 1 d
  • 【剑指offer】总集

    目录 前言 题目索引 数据结构 数 数据结构 数组 数据结构 字符串 数据结构 链表 数据结构 树 数据结构 队列 栈 堆 前言 想看Leetcode总集篇的点它点它 Leetcode总集篇 算法和算法题的任务目标 主要可分为 增 删 改
  • 什么是网站主服务器域名,主域名服务器是什么

    主域名服务器是什么 内容精选 换一换 香港节点和大陆节点的区别如下 香港节点购买域名后无需备案 可以直接在后台绑定域名并使用 大陆节点购买域名后需要先完成备案 才可以在后台绑定域名 香港节点支持绑定多个一级或者子域名 大陆节点只能绑定一个一
  • Linux高性能服务器编程|阅读笔记:第6章 - 高级I/O函数

    目录 简介 6 1 pipe函数 6 2 dup函数和dup2函数 6 3 readv函数和writev函数 6 4 sendfile函数 6 5 mmap函数和munmap函数 6 6 splice函数 6 7 tee函数 6 8 fcn
  • [问题解决方案]JSON parse error: Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using

    公司最近跟外部有一个接受图片的接口让我来做 我心想这么简单 又可以偷懒喽 打开文档一看图片是base64格式的 没啥 不就是base64转字节流吗 一同操作后 测试接受参数 崩出来这个东西 然后就解决呗 总不能因为解决不了让人转变发送参数的
  • 【学习笔记】Python进行数据清洗

    写在前面的话 最近看了一个up主讲基本数据清洗操作 觉得非常好 链接如下 Python 数据清洗 用Python给数据洗澡澡 数据分析 数据清洗 数据预处理 哔哩哔哩 bilibili 评论区也有原数据集和相关代码的链接 不是广告 下面就浅