遇到“脏乱差”的Excel数据怎么办??戳这里,教你利用Python规范Excel表格数据(数据清洗)

SunriseCai 2020-11-13 11:28:31
excel 数据 遇到 脏乱差 脏乱


此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。
本文章纯野生,无任何借鉴他人文章及抄袭等。坚持原创!!

文章开头配备了文中的演示数据,读者朋友们有需要的可以自行下载哦。0积分!!!


1. 前言

你好。这里是【数据分析】Python助你规范Excel表格数据(数据清洗)。我是SunriseCai。

本文章主要介绍利用Python去规范Excel表格数据,算得上是简单的数据清洗。!!!

相信可以帮助部分读者朋友们有效的整理Excel表格。


2. 数据清洗概念

下图引用于—百度百科:数据清洗。
在这里插入图片描述
总结一下(个人拙见),数据清洗的方法就是以下四个特性:

  1. 完整性
    . 如带有缺失值(NaN)需要填写上。
  2. 合理性
    . 如某人年龄到200岁,体重到800千克,明显不合理。
  3. 唯一性
    . 如个别数据出现了重复,需要去重。
  4. 一致性
    . 如单位的 千克 ,需要转换成一致。

下面就是具体的使用代码执行这四个特性啦。

3. 数据展示

示例数据如图:

在这里插入图片描述
上图看的很蒙蔽吧!!连数据标识都没有,这都是什么跟什么啊???这就是那盛传的脏乱差数据吖!!!

其实这是一个球员工作表的数据。

方法 说明 列名
第一列 姓名 name
第二列 身高 height
第三列 体重 weight
第四列 工作天数 working
第五列 工资 salary

这都是一些球星和身高体重,后面的工作天数和工资都是我瞎编的。。。

看到姓名这一列,首字母有的大写、有的小写。身高和体重这一列单位不大一样,还存在空行,空值(NaN)非ASCII字符等!!! 看起来着实令人头疼。

特别说明一下,这里选用英文名字是为了更好的说明案例!!不是崇洋媚外哈!!

还有!!需要给每一列加上列名,不然无法进行后续操作。

4. 代码执行

这里主要用到的模块就是Pandas了,也只用到Pandas模块。
如果出现看不懂代码是什么意思,请耐心往下看,文章下面会有文章所有演示代码的释义!!!


安装模块

pip install pandas

导入模块

import pandas as pd

这里的Excel表格文件名为data.xls.

# 导入Excel表格文件
df = pd.read_excel('data.xls')

4.1 完整性

  • 删除空行
df.dropna(how='all', inplace=True)
  • 填充空值(此处有两个方法,取平均值最高频次
# 对工作天数 和 工资列 取该列平均值
df['working'].fillna(round(df['working'].mean()), inplace=True)
df['salary'].fillna(round(df['salary'].mean()), inplace=True)
# 最高频次
# work_maxf = df['working'].value_counts().index[0]
# df['working'].fillna(work_maxf, inplace=True)
# 最高频次
# work_maxf = df['salary'].value_counts().index[0]
# df['salary'].fillna(work_maxf, inplace=True)

4.2 合理性

  • 这里的 Shaquille O'Neal 看起来带了 非ASCII字符,需要删除非ASCII字符
# 正则匹配 删除 非ASCII字符
df['name'].replace({
r'[^\x00-\x7F]+':''}, regex=True, inplace=True)

4.3 唯一性

  • 看到有个别行是重复的,需要进行删除
# 删除name、weight、height三个字段都一样的重复行,保留第一行
df.drop_duplicates(['name', 'height', 'weight'], inplace=True)

4.4 一致性

  • 姓名统一首字母大写
# title()为首字母大写 upper()为全部大写 lower()为全部小写
df['name'] = df['name'].str.title()
  • 身高单位统一转换成厘米(cm)
for index, data in df.iterrows(): # 1
height = data['height']
if 'cm' not in height: # 2
height = round(float(height[:-1]) * 100) # 3
df.at[index, 'height'] = f'{height}cm' # 4
## 代码释义:
1 -- 返回一个元组(index,row) 索引和数据
2 -- 判断 'cm'是否在 'height'里边
3 -- 对单位为 'm'的数据取浮点,并去掉最后一位'm',100转换为 'cm'
4 -- 获取某个位置的值,例如,获取第0行,第a列的值,df.at[0, 'a']

  • 体重统一转换成千克(kg)
rows_with_lb = df['weight'].str.contains('lb', na=False) # 1
for index, data in df[rows_with_lb].iterrows(): # 2
weight = int(float(data['weight'][:-2]) / 2.2) # 3
df.at[index, 'weight'] = f'{weight}kg' # 4
## 代码释义:
1 -- 获取 weight 数据列中单位为 lb 的数据
2 -- 返回一个元组(index,row) 索引和数据
3 -- 截取从头开始到倒数第三个字符之前,即去掉lbs,并将磅转换为千克:磅 * 2.2 = 千克
4 -- 获取某个位置的值,例如,获取第0行,第a列的值,df.at[0, 'a']

4.5 处理后的数据表

处理后的数据表如下,怎么样。看起来好看很多了吧!!!
在这里插入图片描述

4.6 保存处理后的数据

# 保存为Excel表格
df.to_excel('clean_data.xls')
# 保存为csv表格
df.to_csv('clean_data.csv')

4.7 总结

回过头来看看,本次文章对文中示例的数据做了那些操作。

  1. 删除空行
  2. 填充空值
  3. 删除非ASCII字符
  4. 删除重复行
  5. 姓名统一首字母大写
  6. 身高单位统一转换成厘米(cm)
  7. 体重统一转换成千克(kg)
  8. 最后就是将清洗后的数据保存为心的表格文档啦。

诚然,本文章不能作为标准的数据清洗学习,但是也有一定的参考价值!!!

至此!!相信你已经可以对类似文中示例的脏乱差数据进行清洗了。


5. 文章用到的pandas代码整合

5.1 删除空行

df.dropna(how='all', inplace=True) # 删除空行

5.2 删除重复的数据行

传参为判断的重复与否的列,
默认删除保留重复数据第一条,keep用于指定删除留下哪一列,first留下第一条,last留下最后一条,False表示删除所有重复数据。

# 删除重复数据行
df.drop_duplicates(['name', 'height', 'weight'], keep='last', inplace=True)

5.3 填充空值

# 取salary列平均值
df['salary'].fillna(round(df['salary'].mean()), inplace=True)
# 取Age列最高频次
salary_maxf = df['salary'].value_counts().index[0]
df['salary'].fillna(salary_maxf, inplace=True)

5.4 查找包含某个字符的行

lb 为 查询包含带有lb的行
na=False 为不填充空值

rows_with_lb = df['weight'].str.contains('lb', na=False)
print(df[rows_with_lb])

5.5 替换字符

df.replace,可替换全部,也可替换某一列

regex 默认为Flase,表示正则匹配,如果regex不为True,则需全匹配

5.5.1 替换某列单个字符

df['name'].replace('xxx', '1', regex=True, inplace=True)

5.5.2 替换某列多个字符

多个字符匹配需用字典

# 替换所有的 非ASCII字符 为 空
df['name'].replace({
r'[^\x00-\x7F]+': '123'}, regex=True, inplace=True)

5.3 获取某行某列的数据

作用:获取某个位置的值,例如,获取第0行,第a列的值,

data = df.at[0, 'a'] # 即:index=0,columns='a', 

5.4 返回每行数据的可迭代对象

返回对象是一个元组(index,row) 索引和数据

一般定义两个变量接收返回,第一个为索引,第二个为行数据。

for index,value in df.iterrows():
print(index,value) # 取Age列的数据 value[Age]

5.5 拆分某列并生成新列

expand,将拆分的字符串展开为单独的列。默认为False

df[['first_name', 'last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True) # 删除name列,需要指定axis

6. 后面的话

好了,本次的分享就到这里。
有任何疑问欢迎留言。
也欢迎加入QQ群一起交流:648696280

版权声明
本文为[SunriseCai]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_45081575/article/details/105421243

  1. 利用Python爬虫获取招聘网站职位信息
  2. Using Python crawler to obtain job information of recruitment website
  3. Several highly rated Python libraries arrow, jsonpath, psutil and tenacity are recommended
  4. Python装饰器
  5. Python实现LDAP认证
  6. Python decorator
  7. Implementing LDAP authentication with Python
  8. Vscode configures Python development environment!
  9. In Python, how dare you say you can't log module? ️
  10. 我收藏的有关Python的电子书和资料
  11. python 中 lambda的一些tips
  12. python中字典的一些tips
  13. python 用生成器生成斐波那契数列
  14. python脚本转pyc踩了个坑。。。
  15. My collection of e-books and materials about Python
  16. Some tips of lambda in Python
  17. Some tips of dictionary in Python
  18. Using Python generator to generate Fibonacci sequence
  19. The conversion of Python script to PyC stepped on a pit...
  20. Python游戏开发,pygame模块,Python实现扫雷小游戏
  21. Python game development, pyGame module, python implementation of minesweeping games
  22. Python实用工具,email模块,Python实现邮件远程控制自己电脑
  23. Python utility, email module, python realizes mail remote control of its own computer
  24. 毫无头绪的自学Python,你可能连门槛都摸不到!【最佳学习路线】
  25. Python读取二进制文件代码方法解析
  26. Python字典的实现原理
  27. Without a clue, you may not even touch the threshold【 Best learning route]
  28. Parsing method of Python reading binary file code
  29. Implementation principle of Python dictionary
  30. You must know the function of pandas to parse JSON data - JSON_ normalize()
  31. Python实用案例,私人定制,Python自动化生成爱豆专属2021日历
  32. Python practical case, private customization, python automatic generation of Adu exclusive 2021 calendar
  33. 《Python实例》震惊了,用Python这么简单实现了聊天系统的脏话,广告检测
  34. "Python instance" was shocked and realized the dirty words and advertisement detection of the chat system in Python
  35. Convolutional neural network processing sequence for Python deep learning
  36. Python data structure and algorithm (1) -- enum type enum
  37. 超全大厂算法岗百问百答(推荐系统/机器学习/深度学习/C++/Spark/python)
  38. 【Python进阶】你真的明白NumPy中的ndarray吗?
  39. All questions and answers for algorithm posts of super large factories (recommended system / machine learning / deep learning / C + + / spark / Python)
  40. [advanced Python] do you really understand ndarray in numpy?
  41. 【Python进阶】Python进阶专栏栏主自述:不忘初心,砥砺前行
  42. [advanced Python] Python advanced column main readme: never forget the original intention and forge ahead
  43. python垃圾回收和缓存管理
  44. java调用Python程序
  45. java调用Python程序
  46. Python常用函数有哪些?Python基础入门课程
  47. Python garbage collection and cache management
  48. Java calling Python program
  49. Java calling Python program
  50. What functions are commonly used in Python? Introduction to Python Basics
  51. Python basic knowledge
  52. Anaconda5.2 安装 Python 库(MySQLdb)的方法
  53. Python实现对脑电数据情绪分析
  54. Anaconda 5.2 method of installing Python Library (mysqldb)
  55. Python implements emotion analysis of EEG data
  56. Master some advanced usage of Python in 30 seconds, which makes others envy it
  57. python爬取百度图片并对图片做一系列处理
  58. Python crawls Baidu pictures and does a series of processing on them
  59. python链接mysql数据库
  60. Python link MySQL database