数学建模之数据分析【十】:处理Pandas中的缺失数据

公众号:快乐数模
小红书:学数模使我快乐

当没有提供一个或多个项目或整个单元的信息时,可能会出现缺失数据。缺失数据在现实生活中是一个非常大的问题。缺失数据在 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)))

在这里插入图片描述

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清上尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值