📅  最后修改于: 2020-04-20 04:50:14             🧑  作者: Mango
如果没有为一个或多个项目或整个单元提供信息,则可能会发生数据丢失。在现实生活中,数据丢失是一个非常大的问题。缺失数据也可以称为NA
,即不可用值。在DataFrame中,有时许多数据集缺少数据,要么是因为它存在而未被收集,要么是它不存在。例如,假设被调查的不同用户可能选择不分享其收入,某些用户可能会选择不分享地址,从而丢失了许多数据集。
在pandas中,缺失数据由两个值表示:
pandas的None
和NaN
基本上是可互换的,用于指示缺失或空值。为了促进此约定,在Pandas DataFrame中有几个有用的函数可用于检测,删除和替换空值:
在本文中,我们使用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值。