zoukankan      html  css  js  c++  java
  • [数据清洗]- 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 清洗“脏”数据(三)

  • 相关阅读:
    set转成toarray()
    list和set的拉拉扯扯的关系
    【转载】VNC和远程桌面的区别
    笔记本最小安装centos7 连接WiFi的方法
    mysql 索引优化 性能调优 锁
    PageHelper 自动去掉排序参数问题
    抽奖算法 百万次抽奖 单线程环境下 约 3.5 秒
    gitlab 安装和使用
    sharding sphere 分表分库 读写分离
    mycat 安装 分表 分库 读写分离
  • 原文地址:https://www.cnblogs.com/BoyceYang/p/8202366.html
Copyright © 2011-2022 走看看