📜  Pandas处理丢失数据

📅  最后修改于: 2020-04-20 04:50:14             🧑  作者: Mango

如果没有为一个或多个项目或整个单元提供信息,则可能会发生数据丢失。在现实生活中,数据丢失是一个非常大的问题。缺失数据也可以称为NA,即不可用值。在DataFrame中,有时许多数据集缺少数据,要么是因为它存在而未被收集,要么是它不存在。例如,假设被调查的不同用户可能选择不分享其收入,某些用户可能会选择不分享地址,从而丢失了许多数据集。
在pandas中,缺失数据由两个值表示:

  • None:None是Python单例对象,通常用于Python代码中的丢失数据。
  • NaN:NaN(非数字的缩写),是使用标准IEEE浮点表示法的所有系统都能识别的特殊浮点值

pandas的NoneNaN基本上是可互换的,用于指示缺失或空值。为了促进此约定,在Pandas DataFrame中有几个有用的函数可用于检测,删除和替换空值:

  • isnull()
  • notnull()
  • dropna()
  • fillna()
  • replace()
  • interpolate()

在本文中,我们使用CSV文件,以下载使用的CSV文件,请点击此处

使用isnull()和检查缺失值notnull()

为了检查Pandas DataFrame中的缺失值,我们使用函数isnull()notnull()。这两个功能都有助于检查值是否正确NaN。这些功能也可以在Pandas Series中使用,以便在系列中查找空值。

使用检查缺失值 isnull()

为了检查Pandas DataFrame中的空值,我们使用isnull()此函数返回布尔值的数据框,该布尔值对于NaN值是True。
代码1: 

# 导入pandas
import pandas as pd
# 导入numpy
import numpy as np
# 列表字典
dict = {'First Score':[100, 90, np.nan, 95],
        'Second Score': [30, 45, 56, np.nan],
        'Third Score':[np.nan, 40, 80, 98]}
# 从字典dict创建数据框
df = pd.DataFrame(dict)
# using isnull() function
df.isnull()

输出:



代码#2: 

# 导入pandas
import pandas as pd
# 从csv文件制作数据帧
data = pd.read_csv("employees.csv")
# 为NaN值创建True
bool_series = pd.isnull(data["Gender"])
# 过滤数据仅显示性别= NaN的数据
data[bool_series]

输出:


如输出图像所示,仅Gender = NULL显示具有的行。

使用检查缺失值 notnull()

为了检查Pandas Dataframe中的空值,我们使用notnull()函数,此函数返回布尔值的数据帧,对于NaN值,它们为False。
代码3:

# 导入pandas
import pandas as pd
# 导入numpy
import numpy as np
# 列表字典
dict = {'First Score':[100, 90, np.nan, 95],
        'Second Score': [30, 45, 56, np.nan],
        'Third Score':[np.nan, 40, 80, 98]}
# 使用字典创建数据框
df = pd.DataFrame(dict)
# 使用notnull()函数
df.notnull()

输出:



代码#4:

# 导入pandas
import pandas as pd
# 从csv文件制作数据帧
data = pd.read_csv("employees.csv")
# 为NaN值创建布尔系列True
bool_series = pd.notnull(data["Gender"])
# 过滤数据displayind数据仅使用Gender = Not NaN
data[bool_series]

输出:


如输出图像所示,仅Gender = NOT NULL显示具有的行。

使用填充缺失值fillna()replace()interpolate()

为了填补在数据集中的空值,我们使用fillna()replace()interpolate()发挥这些功能与自己的一些值替换NaN值。所有这些功能有助于在DataFrame的数据集中填充空值。Interpolate()函数基本上用于填充NA数据帧中的值,但它使用各种插值技术来填充丢失的值,而不是对值进行硬编码。
代码1:使用单个值填充空值

# 导入pandas
import pandas as pd
# 导入numpy
import numpy as np
# 列表字典
dict = {'First Score':[100, 90, np.nan, 95],
        'Second Score': [30, 45, 56, np.nan],
        'Third Score':[np.nan, 40, 80, 98]}
# 从字典创建数据框
df = pd.DataFrame(dict)
# 使用fillna()填充缺失值
df.fillna(0)

输出:

代码#2:用先前的值填充空值

# 导入pandas
import pandas as pd
# 导入numpy
import numpy as np
# 列表字典
dict = {'First Score':[100, 90, np.nan, 95],
        'Second Score': [30, 45, 56, np.nan],
        'Third Score':[np.nan, 40, 80, 98]}
# 从字典创建数据框
df = pd.DataFrame(dict)
# 用先前的值填充缺失的值
df.fillna(method ='pad')

输出:



代码#3:用下一个填充空值

# 导入pandas
import pandas as pd
# 导入numpy
import numpy as np
# 列表字典
dict = {'First Score':[100, 90, np.nan, 95],
        'Second Score': [30, 45, 56, np.nan],
        'Third Score':[np.nan, 40, 80, 98]}
# 从字典创建数据框
df = pd.DataFrame(dict)
# 使用fillna()函数填充空值
df.fillna(method ='bfill')

输出:



代码#4:在CSV文件中填充空值

# 导入pandas
import pandas as pd
# 从csv文件制作数据帧
data = pd.read_csv("employees.csv")
# 打印数据帧的前10至24行以进行可视化
data[10:25]


现在,我们将使用“无性别”填充“性别”列中的所有空值

# 导入pandas
import pandas as pd
# 从csv文件制作数据帧
data = pd.read_csv("employees.csv")
# 使用fillna()填充空值
data["Gender"].fillna("No Gender", inplace = True)
data

输出:



代码#5:使用replace()方法填充空值

# 导入pandas
import pandas as pd
# 从csv文件制作数据帧
data = pd.read_csv("employees.csv")
# 打印数据帧的前10至24行以进行可视化
data[10:25]

输出:



现在我们将用-99值替换数据框中的所有Nan值。

# 导入pandas
import pandas as pd
# 从csv文件制作数据帧
data = pd.read_csv("employees.csv")
# 将值-99替换数据框中的Nan值
data.replace(to_replace = np.nan, value = -99)

输出:



代码6:使用interpolate()函数使用线性方法填充缺少的值。

# 导入pandas
import pandas as pd
# 创建数据框
df = pd.DataFrame({"A":[12, 4, 5, None, 1],
                   "B":[None, 2, 54, 3, None],
                   "C":[20, 16, None, 3, 8],
                   "D":[14, 3, None, None, 6]})
# 打印数据框
df


让我们使用线性方法对缺失值进行插值。请注意,线性方法会忽略索引,并将值等距地对待。

# to interpolate the missing values
df.interpolate(method ='linear', limit_direction ='forward')

输出:



正如我们看到的输出,第一行中的值无法填充,因为值的填充方向是向前的,并且没有以前的值可用于插值。

使用删除缺失值 dropna()

为了从数据帧中删除空值,我们使用了dropna()该函数,该函数以不同的方式删除具有空值的数据集的行/列。
代码1:删除至少包含1个空值的行。

# 导入pandas
import pandas as pd
# 导入numpy
import numpy as np
# 列表字典
dict = {'First Score':[100, 90, np.nan, 95],
        'Second Score': [30, np.nan, 45, 56],
        'Third Score':[52, 40, 80, 98],
        'Fourth Score':[np.nan, np.nan, np.nan, 65]}
# 从字典创建数据框
df = pd.DataFrame(dict)
df


现在,我们删除至少具有一个Nan值(Null值)的行

# 导入pandas
import pandas as pd
# 导入numpy
import numpy as np
# 列表字典
dict = {'First Score':[100, 90, np.nan, 95],
        'Second Score': [30, np.nan, 45, 56],
        'Third Score':[52, 40, 80, 98],
        'Fourth Score':[np.nan, np.nan, np.nan, 65]}
# 从字典创建数据框
df = pd.DataFrame(dict)
# 使用dropna()函数
df.dropna()

输出:



代码2:如果缺少该行中的所有值,则删除行。

# 导入pandas
import pandas as pd
# 导入numpy
import numpy as np
# 列表字典
dict = {'First Score':[100, np.nan, np.nan, 95],
        'Second Score': [30, np.nan, 45, 56],
        'Third Score':[52, np.nan, 80, 98],
        'Fourth Score':[np.nan, np.nan, np.nan, 65]}
# 从字典创建数据框
df = pd.DataFrame(dict)
df


现在我们删除所有数据缺失或包含空值的行(NaN)

# 导入pandas
import pandas as pd
# 导入numpy
import numpy as np
# 列表字典
dict = {'First Score':[100, np.nan, np.nan, 95],
        'Second Score': [30, np.nan, 45, 56],
        'Third Score':[52, np.nan, 80, 98],
        'Fourth Score':[np.nan, np.nan, np.nan, 65]}
df = pd.DataFrame(dict)
# 使用dropna()函数
df.dropna(how = 'all')

输出:



代码3:删除至少具有1个空值的列。

# 导入pandas
import pandas as pd
# 导入numpy
import numpy as np
# 列表字典
dict = {'First Score':[100, np.nan, np.nan, 95],
        'Second Score': [30, np.nan, 45, 56],
        'Third Score':[52, np.nan, 80, 98],
        'Fourth Score':[60, 67, 68, 65]}
# 从字典创建数据框
df = pd.DataFrame(dict)
df


现在,我们删除一列,其中至少有1个缺失值

# 导入pandas
import pandas as pd
# 导入numpy
import numpy as np
# 列表字典
dict = {'First Score':[100, np.nan, np.nan, 95],
        'Second Score': [30, np.nan, 45, 56],
        'Third Score':[52, np.nan, 80, 98],
        'Fourth Score':[60, 67, 68, 65]}
# 从字典创建数据框
df = pd.DataFrame(dict)
# 使用dropna()函数
df.dropna(axis = 1)

输出:



代码#4:在CSV文件中删除具有至少1个空值的行

# 导入pandas
import pandas as pd
# 从csv文件制作数据帧
data = pd.read_csv("employees.csv")
# 制作具有下降的NA值的新数据框
new_data = data.dropna(axis = 0, how ='any')
new_data

输出:

现在我们比较数据帧的大小,以便我们可以知道多少行的值至少为1 Null

print("旧数据帧长度:", len(data))
print("新数据帧长度:", len(new_data))
print("至少具有1个NA值的行数: ", (len(data)-len(new_data)))

输出:

旧数据帧长度: 1000
新数据帧长度: 764
至少具有1个NA值的行数:  236

由于差异为236,因此共有236行在任何列中至少具有1 Null值。