[数据清洗]-看上去一样的数字

数据不正确(格式不正确,数据不准确,数据缺失)我们做什么都是徒劳。数据清洗时数据分析的第一步,也是最耗时的一步。

数据清洗很枯燥,但是随着数据清理技巧越来越熟练,就有越有可能从他人无从下手的文档中获取更多的有用信息。

这次想说一下,看起来都是正确的数值数据,在人和机器理解起来的差别

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Felix的技术分享

Poj第1083题--Moving Tables

21360
来自专栏企鹅号快讯

Python模块知识2:时间日期日历模块Time、Datetime、Calendar

1、time模块 时间为什么从1970年开始:因为Linux系统那一年开始使用;通常由以下几种方式表示时间: 时间戳:1970年1月1日之后的秒,即:time....

28750
来自专栏程序员的SOD蜜

“法天象而应四时”--茶话软件开发之“抽象”

抽象不仅仅是软件领域,在有灵性的生物中都有抽象; 抽象不仅仅是OO的,非OO语言也有抽象; 抽象的级别: 类级别的抽象--类、抽象类、接口; 方法、函数级别的抽...

24480
来自专栏landv

c语言-猜数字游戏

32940
来自专栏后端技术探索

常见算法面试题

这几天在网上看到一篇关于算法面试题的博客,归纳的很好,有不少经典的题目,大部分来自《编程珠玑》、《编程之美》、《代码之美》三本书。这里给出书上的解答以及一些思考...

33520
来自专栏阿杜的世界

《Scala程序设计》阅读书摘

JVM上的语言越来越多了,从前几年的groovy、Scala和Clojure,现在又听说一门Kotlin。对于前三种语言,groovy算是JVM平台上的动态脚本...

9520
来自专栏令仔很忙

设计模式六大原则——合成/聚合复用原则(CARP)

简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承。

28710
来自专栏iKcamp

翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 6 章:值的不可变性

原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 第 6 章:值的不可变性 在第 ...

21650
来自专栏web编程技术分享

js常用方法和一些封装(1)1.字符串相关2.数组相关

42190
来自专栏Dawnzhang的开发者手册

数据结构与算法学习笔记之高效、简洁的编码技巧“递归”

盗梦空间想象大多数人都看过:电影讲述的是主人公诺兰进入希里安·墨菲梦境植入想法的行动。为了向希里安·墨菲梦植入理念,影片进入四层梦境,即所谓:“梦中的梦中 梦中...

11830

扫码关注云+社区

领取腾讯云代金券