公众号:快乐数模
小红书:学数模使我快乐
当没有提供一个或多个项目或整个单元的信息时,可能会出现缺失数据。缺失数据在现实生活中是一个非常大的问题。缺失数据在 Pandas 中也可以称为 NA(不可用)值。在 DataFrame 中,有时许多数据集都带有缺失数据,要么是因为它存在但未被收集,要么是它从未存在过。例如,假设接受调查的不同用户可能选择不分享他们的收入,一些用户可能选择不分享地址,这样许多数据集就丢失了。
在 Pandas 中,缺失数据用两个值表示:
- None:None 是一个 Python 单例对象,常用于 Python 代码中缺失的数据。
- NaN :NaN(Not a Number 的缩写),是所有使用标准 IEEE 浮点表示法的系统都可识别的特殊浮点值
Pandas 将 None 和 NaN 视为本质上可以互换的,用于表示缺失值或空值。为了促进这种惯例,有几个有用的函数可用于检测、删除和替换。
一、使用 isnull() 和 notnull() 检查缺失值
为了检查 Pandas DataFrame 中的缺失值,我们使用函数 isnull() 和 notnull()。这两个函数都有助于检查值是否为 NaN。这些函数也可以在 Pandas Series 中使用,以便在系列中查找空值。
1.1 使用 isnull() 检查缺失值
为了检查 Pandas DataFrame 中的空值,我们使用 isnull() 函数,该函数返回对于 NaN 值为 True 的布尔值的数据框。
代码一:
import pandas as pd
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.isnull()
代码二:
import pandas as pd
data = pd.read_csv('employees.csv')
bool_series = pd.isnull(data['Gender'])
print(data[bool_series])
输出:如输出图所示,仅显示 Gender = NULL 的行。
1.2 使用notnull() 检查缺失值
为了检查 Pandas Dataframe 中的空值,我们使用 notnull() 函数,该函数返回布尔值的数据框,对于 NaN 值为 False。
代码三:
import pandas as pd
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.notnull()
代码四:
import pandas as pd
data = pd.read_csv('employees.csv')
bool_series = pd.notnull(data['Gender'])
print(data[bool_series])
仅显示 Gender = NOT NULL 的行。
二、使用 fillna()、replace() 和 interpolate() 填充缺失值
为了在数据集中填充空值,我们使用 fillna()、replace() 和 interpolate() 函数,这些函数用它们自己的某个值替换 NaN 值。所有这些函数都有助于在 DataFrame 的数据集中填充空值。Interpolate() 函数主要用于在数据框中填充 NA 值,但它使用各种插值技术来填充缺失值,而不是对值进行硬编码。
代码一:用单个值填充空值
importing pandas as pd
import pandas as pd
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(0)
代码二:用之前的值填充空值
import pandas as pd
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')
代码三:用下一个值填充空值
import pandas as pd
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)
print(df.fillna(method ='bfill'))
代码四:再CSV文件中填充空值
#读入文件
import pandas as pd
data = pd.read_csv('employees.csv')
print(data[10:25])
用’No Gender’扩充“性别列”中的所有空值
import pandas as pd
data = pd.read_csv('epmloyees.csv')
data['Gender'].fillna('No Gender', inplace = True)
print(data)
使用-99的值替换数据框中所有的Nan值
import pandas as pd
import numpy as np
data = pd.read_csv('employees.csv')
data.replace(to_replace=np.nan, value=-99, inplace=True)
print(data)
使用 interpolate() 函数以线性方法填充缺失值
打印原始数据集:
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]})
print(df)
让我们使用线性方法插入缺失值。请注意,线性方法忽略索引并将值视为等距。
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 = df.interpolate(method ='linear', limit_direction ='forward')
print(df)
在输出中可以看到的,第一行的值无法填充,因为值的填充方向是向前的,并且没有可以用于插值的先前值。
使用 dropna() 删除缺失值
为了从数据框中删除空值,我们使用了 dropna() 函数,该函数以不同的方式删除具有空值的数据集的行/列。
代码#1:删除至少有 1 个空值的行。
原始数据
import pandas as pd
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)
print(df)
删除至少有一个空值的行:
import pandas as pd
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)
print(df.dropna())
代码#2:如果某一行中的所有值都缺失,则删除该行。
import pandas as pd
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)
print(df.dropna(how = 'all'))
代码三:
删除至少有一个空值的列
import pandas as pd
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)
print(df.dropna(axis=1))
代码四:删除CSV文件中至少有一个空值的行
import pandas as pd
data = pd.read_csv('employees.csv')
new_data = data.dropna(axis=0, how='any')
print(new_data)
比较新旧数据的长度,我们就能的到原始数据至少有一个空值的行的个数。
import pandas as pd
data = pd.read_csv('employees.csv')
new_data = data.dropna(axis=0, how='any')
#print(new_data)
print('旧数据长度', len(data))
print('新数据长度', len(new_data))
print('至少有一个空值的行的个数', (len(data)-len(new_data)))