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

写在前面的话

最近看了一个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. 总结(思维导图)

  • 4
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
学习数据分析是当代信息时代的一项重要技能,Python作为一种强大的编程语言,是数据分析的热门工具之一。以下是我在学习利用Python进行数据分析过程中的一些笔记。 首先,学习Python的基础知识是必不可少的。了解Python的基本语法、数据类型、循环和条件语句等知识对于数据分析的学习非常重要。我通过自学网课和阅读相关书籍,逐渐掌握了Python的基础知识。 其次,学习使用Python数据分析库。在Python中,有很多强大的数据分析库,例如NumPy、Pandas和Matplotlib等。我通过学习这些库的用法,掌握了数据的处理、清洗、分析和可视化的技巧。我学习了如何使用NumPy进行矩阵运算和数值计算,如何使用Pandas进行数据处理和数据操作,以及如何使用Matplotlib进行数据可视化。 除了数据分析库,学习Python的机器学习库也是必不可少的。机器学习数据分析中扮演着重要角色,Python中有很多优秀的机器学习库,例如Scikit-learn和TensorFlow。我通过学习这些库的使用,了解了机器学习的基本概念和常用算法,例如回归、分类和聚类等。我也学习了如何使用这些库来构建和训练机器学习模型。 最后,实践是学习的关键。在学习的过程中,我通过实践项目来巩固所学知识。我选择了一些真实的数据集,并运用Python数据分析技术进行数据处理、分析和可视化。通过实践,我不仅掌握了数据分析的具体步骤和方法,还锻炼了自己解决实际问题的能力。 总的来说,学习利用Python进行数据分析需要掌握Python的基础知识、数据分析库和机器学习库的使用,同时也需要通过实践项目来巩固所学知识。这个过程需要持续不断的学习和实践,但是通过不断的努力和实践,我相信能够掌握Python进行数据分析的技能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

砂锅咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值