[数据清洗]-看上去一样的数字
数据不正确(格式不正确,数据不准确,数据缺失)我们做什么都是徒劳。数据清洗时数据分析的第一步,也是最耗时的一步。
数据清洗很枯燥,但是随着数据清理技巧越来越熟练,就有越有可能从他人无从下手的文档中获取更多的有用信息。
这次想说一下,看起来都是正确的数值数据,在人和机器理解起来的差别
Pandas 加载数据后, head() 预览一下,感觉数据还不错,但是,很有可能是被数据的表象所蒙蔽了。
在 Python 中,2 是一个数字,“2”是一个字符。他们是不同的数据类型,但是,都可以进行数学计算。示例如下:
如果刚开始接触 Python 的人会有些疑惑,这是什么鬼,是不是例子处理意外。
“2”* 2 => 22
2 * 2 => 4
不仅仅是 *,在 Python 中 + 也一样,只要他们操作的两边数据类型一致就可以运算。
注意,要是将一个字符串数字和一个数值数字相加,就会出现异常“TypeError: must be str, not int”
“*” 和 “*” 操作很灵活,只要理解这些行为,似乎也不是个问题。这样问题的产生主要是语言设计者所决定的,他们只是没有把字符串的拼接和数值相加使用了同样的操作符。
下面就造一些数据,在 DataFrame 中看起来都像是数值类型数字的数据。
从输出来看,都是数值类型的数据,接下来,我们做一些简单的数据分析。假设需求,将所有的数值增大十倍。
似乎结果和最初设想的有所差距。
Data2 行的数据看上去想数值,但是,就结果来看,也不像是数值。现在我们最迫切需要知道的每列数据的类型是什么,Pandas 已经提供了查看 DataFrame 各个列数据类型的属性。
怎么回事,都是 object 类型,Pandas 并没有承认这些数据是数值类型。所以,开始数据分析之前,做数据清洗还是有必要的。Pandas 提供了转换数值类型的方法,to_numeric()。
我们现在尝试将 Data2 行的数据转换成数值类型
转换失败,to_numeric() 不能将字符串 “F”转换为数值类型,我们也没有在代码中控制,所以抛异常了。Pandas 提供了一个可选的参数 errors,传入 errors='coerce' Pandas 遇到不能转换的数据就会赋值为 NaN(Not a Number)
从结果来看,好像这次除了 “F”是空值外,其他的数据都转换了对应的数值。我们再次执行翻十倍的运行算
下面我们再次查看一下数据的类型。
现在数据和我们设想的一样了。
这几次的博客都涉及了 lambda 的使用,如果有同学需要我提供一个 lambda 相关的文章,请留言,以便我规划一下时间。
整合代码
# 演示数字和字符串的区别
two_char = '2'
two_num = 2
def doubule(x):
return x * 2
print('char:{}'.format(doubule(two_char)))
print('num:{}'.format(doubule(two_num)))
print('text:{}'.format(doubule('Test text end ')))
# 报错,类型不对
print("2" + 2)
# 模拟数据
import pandas as pd
df = pd.DataFrame([[1,2,3,4,16],['1','2','3','4','F']],index =['Data1','Data2'])
print(df)
# 翻十倍,查看结果与预想结果的差别
df.apply(lambda x: x * 10)
# 查看数据类型
df.dtypes
# 尝试转换,报错
df.loc['Data2'] = pd.to_numeric(df.loc['Data2'])
# 只转换能转换的,不能转换的赋值为 NaN(Not a Number)
df.loc['Data2'] = pd.to_numeric(df.loc['Data2'] ,errors='coerce')
# 查看成功转换后的结果
df.loc['Data2']
# 再次运算,查看结果与预想结果的差别
df = df.apply(lambda x: x * 10)
print(df)
# 查看数据类型
df.dtypes
更多关于数据清洗的内容可以关注知乎上的专栏“数据清洗”
知乎 https://zhuanlan.zhihu.com/p/32681964
- sql语句查询到整个数据库的容量
- 神奇的go语言
- 备库查询导致的ORA-01110错误及修复(r8笔记第67天)
- SQL客户端DBvisualize直接导入数据出现中文乱码
- Python基础整理操作积累
- 让AI给颜值打分?应该是最公正的裁判了!
- orion的简单测试 (r8笔记第75天)
- golang ftp客户端示例 支持断点续传
- python 网页特征提取XPATH(两天玩转) 第一天
- 和开发同学讨论的一个技术问题(r8笔记第73天)
- 剖析Oracle中oerr命令(r8笔记第70天)
- 甜品店切蛋糕问题(动态规划,Go语言实现)
- SQL—复制表结构及其数据
- python连接SQL报错:1366, "Incorrect string value: '\xF0\x9F\x98\x81'
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法