[数据清洗]- Pandas 清洗“脏”数据(三)

预览数据

这次我们使用 Artworks.csv ,我们选取 100 行数据来完成本次内容。具体步骤:

  1. 导入 Pandas
  2. 读取 csv 数据到 DataFrame(要确保数据已经下载到指定路径)

DataFrame 是 Pandas 内置的数据展示的结构,展示速度很快,通过 DataFrame 我们就可以快速的预览和分析数据。代码如下:

import pandas as pd

​

df = pd.read_csv('../data/Artworks.csv').head(100)

df.head(10)

统计日期数据

我们仔细观察一下 Date 列的数据,有一些数据是年的范围(1976-1977),而不是单独的一个年份。在我们使用年份数据画图时,就不能像单独的年份那样轻易的画出来。我们现在就使用 Pandas 的 value_counts() 来统计一下每种数据的数量。

首先,选择要统计的列,并调用 value_counts():

df['Date'].value_counts()

日期数据问题

Date 列数据,除了年份是范围外,还有三种非正常格式。下面我们将这几种列出来:

  • 问题一,时间范围(1976-77)
  • 问题二,估计(c. 1917,1917 年前后)
  • 问题三,缺失数据(Unknown)
  • 问题四,无意义数据(n.d.)

接下来我们会处理上面的每一个问题,使用 Pandas 将这些不规则的数据转换为统一格式的数据。

问题一和二是有数据的只是格式上欠妥当,问题三和四实际上不是有效数据。针对前两个问题,我们可以通过代码将据格式化来达到清洗的目的,然而,后两个问题,代码上只能将其作为缺失值来处理。简单起见,我们将问题三和四的数据处理为0。

处理问题一

问题一的数据都是两个年时间范围,我们选择其中的一个年份作为清洗之后的数据。为了简单起见,我们就使用开始的时间来替换这样问题的数据,因为这个时间是一个四位数的数字,如果要使用结束的年份,我们还要补齐前两位的数字。

首先,我们需要找到问题一的数据,这样我们才能将其更新。要保证其他的数据不被更新,因为其他的数据有可能是已经格式化好的,也有可能是我们下面要处理的。

我们要处理的时间范围的数据,其中包含有“-”,这样我们就可以通过这个特殊的字符串来过滤我们要处理的数据,然后,通过 split() 利用“-”将数据分割,将结果的第一部分作为处理的最终结果。

代码如下

row_with_dashes = df['Date'].str.contains('-').fillna(False)

for i, dash in df[row_with_dashes].iterrows():

    df.at[i,'Date'] = dash['Date'][0:4]

df['Date'].value_counts()

处理问题二

问题二的数据体现了数据本身的不准确性,是一个估计的年份时间,我们将其转换为年份,那么,就只要保留最后四位数字即可,该数据的特点就是数据包含“c”,这样我们就可以通过这一特征将需要转换的数据过滤出来。

row_with_cs = df['Date'].str.contains('c').fillna(False)

for i,row in df[row_with_cs].iterrows():

    df.at[i,'Date'] = row['Date'][-4:]

df[row_with_cs]

处理问题三四

将这问题三四的数据赋值成初始值 0。

df['Date'] = df['Date'].replace('Unknown','0',regex=True)

df['Date'] = df['Date'].replace('n.d.','0',regex=True)

df['Date']

代码整合

mport pandas as pd

​

df = pd.read_csv('../data/Artworks.csv').head(100)

df.head(10)

​

df['Date'].value_counts()

​

row_with_dashes = df['Date'].str.contains('-').fillna(False)

for i, dash in df[row_with_dashes].iterrows():

    df.at[i,'Date'] = dash['Date'][0:4]

df['Date'].value_counts()

​

row_with_cs = df['Date'].str.contains('c').fillna(False)

for i,row in df[row_with_cs].iterrows():

    df.at[i,'Date'] = row['Date'][-4:]

df['Date'].value_counts()

​

df['Date'] = df['Date'].replace('Unknown','0',regex=True)

df['Date'] = df['Date'].replace('n.d.','0',regex=True)

df['Date'].value_counts()

更多关于数据清洗的内容可以关注知乎上的专栏“数据清洗

知乎 数据清洗- Pandas 清洗“脏”数据(三)

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言及其他语言

[每日一题]选择法排序

谈到排序的方法,可以说是多种多样,比较常用的是冒泡法,而效率比较高的是快速法,今天给大家介绍的则是选择法 题目描述 用选择法对10个整数从小到大排序。 输入 ...

30860
来自专栏java一日一条

重构 改善既有代码的设计--笔记

查看一个类是否“过大”,这里有一个小技巧分享给大家。就是看两点:1)这个类实例变量太多,必然会有Duplicated Code(重复代码) 2)类内如果有太多代...

11940
来自专栏Crossin的编程教室

【Python 第59课】 正则表达式(5)

听说有人已经开始国庆假期了,甚至还有人中秋之后就请了年假一休到底,表示羡慕嫉妒恨!今天发完这课,我也要进入休假状态,谁也别拦着我。 来说上次的习题: (021...

33480
来自专栏xingoo, 一个梦想做发明家的程序员

通过两个小栗子来说说Java的sleep、wait、notify、notifyAll的用法

线程是计算程序运行的最小载体,由于单个单核CPU的硬件水平发展到了一定的瓶颈期,因此就出现了多核多CPU的情况,直接就导致程序员多线程编程的复杂。由此可见线程...

24980
来自专栏java一日一条

哪些因素影响Java调用的性能?

这得从一个小故事说起。我在一个Java核心库的邮件列表中提交了一个修改 ——重写了一些本是 final 的方法。一石激起千层浪,这一改动引发了几番讨论。而其中一...

13310
来自专栏编程

浅谈Java学习方法和后期面试技巧 含学习笔记

下面简单列举一下大家学习java的一个系统知识点的一些介绍: 一、java基础部分:java基础的时候,有些知识点是非常重要的,比如循环系列。For,while...

20780
来自专栏北京马哥教育

国家认证的Python工程师有什么能力要求?

Python这门语言近来是越来越火,在国家层面越来越被重视。除了之前热议的加入高考和中小学教育之外,现在连普通大学生也无法逃脱Python的毒手了。

67100
来自专栏静默虚空的博客

如何学习一门编程语言

前言 很多人喜欢争论什么什么编程语言好,我认为这个话题如果不限定应用范围,就毫无意义。 每种编程语言必然有其优点和缺点,这也决定了它有适合的应用场景和不适合的应...

45350
来自专栏java工会

深度思考编程的艺术

17980
来自专栏微信公众号:Java团长

Java编程的21个常见错误

代码重复几乎是最常见的异味了。他也是Refactoring 的主要目标之一。代码重复往往来自于copy-and-paste 的编程风格。与他相对应OAOO 是...

11730

扫码关注云+社区

领取腾讯云代金券