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

预览数据

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

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

DataFrame 是 Pandas 内置的数据展现的结构,展现速度很快,经过 DataFrame 咱们就能够快速的预览和分析数据。代码以下:github

import pandas as pd

​

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

df.head(10)

 

 

统计日期数据

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

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

df['Date'].value_counts()

 

 

 

日期数据问题

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

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

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

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

 

处理问题一

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

首先,咱们须要找到问题一的数据,这样咱们才能将其更新。要保证其余的数据不被更新,由于其余的数据有多是已经格式化好的,也有多是咱们下面要处理的。it

咱们要处理的时间范围的数据,其中包含有“-”,这样咱们就能够经过这个特殊的字符串来过滤咱们要处理的数据,而后,经过 split() 利用“-”将数据分割,将结果的第一部分做为处理的最终结果。io

代码以下

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 清洗“脏”数据(三)