zoukankan      html  css  js  c++  java
  • Python—关于Pandas缺失值问题(国内唯一)

    获取文中的CSV文件用于代码编程以及文章首发地址,请点击下方超链接

    获取CSV,用于编程调试请点这

    在本文中,我们将使用PythonPandas库逐步完成许多不同的数据清理任务。具体而言,我们将重点关注可能是最大的数据清理任务,即 缺少值。

    缺失值的来源

    在深入研究代码之前,了解丢失数据的来源很重要。这是数据丢失的一些典型原因:

    • 用户忘记填写字段。
    • 从旧版数据库手动传输时,数据丢失。
    • 发生编程错误。
    • 用户选择不填写字段。

    其中一些来源只是简单的随机错误。在其他时候,可能会有更深层的原因导致数据丢失。

    准备工作

    在开始清理数据集之前,最好先大致了解一下数据。

    • 有哪些功能?
    • 预期的类型是什么(int,float,string,boolean)?
    • 是否有明显的缺失数据(熊猫可以检测到的值)?
    • 是否还有其他类型的丢失数据不太明显(无法通过Pandas轻松检测到)?

    了说明我的意思,让我们开始研究示例。

    我们要使用的数据是非常小的房地产数据集。获取CSV文件。你可以单击此处获取,以便可以进行编码。
    在这里插入图片描述

    快速浏览一下数据:

    快速了解数据的一种好方法是查看前几行。在Pandas中,你要编写以下代码:

    # Importing libraries
    import pandas as pd
    import numpy as np
    
    # Read csv file into a pandas dataframe
    df = pd.read_csv("property data.csv")
    
    # Take a look at the first few rows
    print df.head()
    
    
    Out:
       ST_NUM    ST_NAME OWN_OCCUPIED  NUM_BEDROOMS
    0   104.0     PUTNAM            Y           3.0
    1   197.0  LEXINGTON            N           3.0
    2     NaN  LEXINGTON            N           3.0
    3   201.0   BERKELEY          NaN           1.0
    4   203.0   BERKELEY            Y           3.0
    
    

    我知道我说过我们将使用Pandas,但是可以看到我也使用了Numpy。稍后我们将使用它来重命名一些缺失的值。

    导入库后,我们将csv文件读取到Pandas数据框中。

    使用该方法,我们可以轻松看到前几行。(使用.head()方法)

    从列名称中推断出以下字符组非常容易:

    • ST_NUM: 街道号码
    • ST_NAME: 街道名称
    • OWN_OCCUPIED:住所所有人是否被占用
    • NUM_BEDROOMS:卧室数

    我们还可以进行设置,获取的数据类型是啥?

    • ST_NUM:float或int…某种数字类型
    • ST_NAME: 细绳
    • OWN_OCCUPIED:字符串…Y(“是”)或N(“否”)
    • NUM_BEDROOMS:float或int,数字类型

    标准缺失值

    “标准缺失值”是什么意思?这些是Pandas可以检测到的缺失值。

    回到我们的原始数据集,让我们看一下“ ST_NUM”列。
    在这里插入图片描述

    第三列中有一个空单元格。在第七行中,有一个“ NA”值。

    显然,这些都是缺失值。让我们看看Pandas如何处理这些问题

    # 查看ST_NUM列
    print df['ST_NUM']
    print df['ST_NUM'].isnull()
    
    # 查看ST_NUM列
    Out:
    0    104.0
    1    197.0
    2      NaN
    3    201.0
    4    203.0
    5    207.0
    6      NaN
    7    213.0
    8    215.0
    
    Out:
    0    False
    1    False
    2     True
    3    False
    4    False
    5    False
    6     True
    7    False
    8    False
    
    

    看一下该列,我们可以看到Pandas在空白处填充了“ NA”。使用该方法,我们可以确认缺失值和“ NA”都被识别为缺失值。两个布尔响应均为。isnull()True

    这是一个简单的示例,但强调了一个重点。Pandas会将空单元格和“ NA”类型都识别为缺失值。 下面,我将介绍一些Pandas无法识别的类型。

    非标准缺失值

    有时可能是缺少具有不同格式的值的情况。

    让我们看一下“Number of Bedrooms”一栏,了解我的意思。
    在这里插入图片描述

    在此列中,有四个缺失值。

    • n/a
    • NA
    • na

    从上面中,我们知道Pandas会将“ NA”识别为缺失值,但其他的情况呢?让我们来看看。

    # 看NUM_BEDROOMS这一栏
    print df['NUM_BEDROOMS']
    print df['NUM_BEDROOMS'].isnull()
    
    
    Out:
    0      3
    1      3
    2    n/a
    3      1
    4      3
    5    NaN
    6      2
    7     --
    8     na
    
    Out:
    0    False
    1    False
    2    False
    3    False
    4    False
    5     True
    6    False
    7    False
    8    False
    

    就像以前一样,Pandas认为“ NA”是缺失的价值。不幸的是,其他类型未被识别。

    如果有多个用户手动输入数据,则这是一个常见问题。也许我喜欢使用“ n / a”,但是其他人喜欢使用“ na”。

    检测这些各种格式的一种简单方法是将它们放在列表中。然后,当我们导入数据时,Pandas会立即识别出它们。这是我们将如何执行此操作的示例。

    # 列出缺失的值类型
    missing_values = ["n/a", "na", "--"]
    df = pd.read_csv("property data.csv", na_values = missing_values)
    

    现在,让我们再看一下该栏,看看会发生什么。

    # 看NUM_BEDROOMS这一栏
    print df['NUM_BEDROOMS']
    print df['NUM_BEDROOMS'].isnull()
    
    Out:
    0    3.0
    1    3.0
    2    NaN
    3    1.0
    4    3.0
    5    NaN
    6    2.0
    7    NaN
    8    NaN
    
    Out:
    0    False
    1    False
    2     True
    3    False
    4    False
    5     True
    6    False
    7     True
    8     True
    

    下面中,我们将介绍一种更复杂但很常见的缺失值类型。

    意外的缺失值

    到目前为止,我们已经看到了标准缺失值和非标准缺失值。如果我们出现意外类型怎么办?

    例如,如果我们的功能应该是字符串,但是有数字类型,那么从技术上讲,这也是一个缺失值。

    让我们看一下“Owner Occupied**”一栏,看看我在说什么。

    在这里插入图片描述

    从前面的示例中,我们知道Pandas将检测到第7行中的空单元格为缺失值。让我们用一些代码进行确认。

    # 查看OWN_OCCUPIED列
    print df['OWN_OCCUPIED']
    print df['OWN_OCCUPIED'].isnull()
    
    # 查看OWN_OCCUPIED列
    Out:
    0      Y
    1      N
    2      N
    3     12
    4      Y
    5      Y
    6    NaN
    7      Y
    8      Y
    
    Out:
    0    False
    1    False
    2    False
    3    False
    4    False
    5    False
    6     True
    7    False
    8    False
    

    在第四行中,数字为12。Owner Occupied的响应显然应该是字符串(Y或N),因此此数字类型应为缺失值

    这个示例稍微复杂一点,因此我们需要考虑一种策略来检测这些类型的缺失值。有很多不同的方法,但是这是我要通过这种方法工作的方式。

    • 遍历OWN_OCCUPIED列
    • 尝试将条目转换为整数
    • 如果条目可以更改为整数,请输入缺失值
    • 如果数字不能是整数,我们知道它是一个字符串,所以继续

    看一下代码,然后我将对其进行详细介绍

    # 检测数据
    cnt=0
    for row in df['OWN_OCCUPIED']:
        try:
            int(row)
            df.loc[cnt, 'OWN_OCCUPIED']=np.nan
        except ValueError:
            pass
        cnt+=1
    

    在代码中,我们循环浏览“所有者已占用”列中的每个条目。要尝试将条目更改为整数,我们使用。int(row)

    如果可以将值更改为整数,则可以使用Numpy's将条目更改为缺少的值。np.nan

    另一方面,如果不能将其更改为整数,我们pass将继续。

    您会注意到我使用tryexcept ValueError。这称为异常处理,我们使用它来处理错误。

    如果我们尝试将一个条目更改为一个整数并且无法更改,则将ValueError返回a,并且代码将停止。为了解决这个问题,我们使用异常处理来识别这些错误,并继续进行下去。

    代码的另一个重要部分是.loc方法。这是用于修改现有条目的首选Pandas方法。有关此的更多信息,请查看Pandas文档。

    现在,我们已经研究了检测缺失值的不同方法,下面将概述和替换它们。

    总结缺失值

    清除缺失的值后,我们可能要对它们进行汇总。例如,我们可能要查看每个功能的缺失值总数。

    # Total missing values for each feature
    print df.isnull().sum()
    
    Out:
    ST_NUM          2
    ST_NAME         0
    OWN_OCCUPIED    2
    NUM_BEDROOMS    4
    

    在更多的时候,我们可能需要进行快速检查,以查看是否根本缺少任何值。

    # Any missing values?
    print df.isnull().values.any()
    
    Out:
    True
    

    我们可能还希望获得缺失值的总数。

    # Total number of missing values
    print df.isnull().sum().sum()
    
    Out:
    8
    

    在上面,我们总结了缺失值的数量,让我们看一下如何进行一些简单的替换。

    更换

    通常,您必须弄清楚如何处理缺失值。

    有时,您只是想删除这些行,而其他时候,您将替换它们。

    正如我之前提到的,这不应该掉以轻心。我们将介绍一些基本的推论。

    # 用一个数字替换缺失的值
    df['ST_NUM'].fillna(125, inplace=True)
    

    如果进行基于位置的插补。

    # 基于位置的更换
    df.loc[2,'ST_NUM'] = 125
    

    替换缺失值的一种非常常见的方法是使用中位数。

    # 取代使用中位数
    median = df['NUM_BEDROOMS'].median()
    df['NUM_BEDROOMS'].fillna(median, inplace=True)
    
  • 相关阅读:
    fastadmin编辑内容,有下拉选择关联的内容,自定义的参数去获取相应的下拉内容
    fastadmin 全手动添加规则
    微擎转移服务器后,出现 require()错误,解决方案
    laravel 路由
    装饰器练习
    python笔记(五)装饰器函数
    练习函数
    练习一
    python笔记(四)文件操作和函数
    py3和py2的差别(补充)
  • 原文地址:https://www.cnblogs.com/CoXieLearnPython/p/14615319.html
Copyright © 2011-2022 走看看