Python 教程之 Pandas(8)—— 在 Pandas 中处理缺失数据

简介: Python 教程之 Pandas(8)—— 在 Pandas 中处理缺失数据

当没有为一个或多个项目或整个单元提供信息时,可能会出现缺失数据。在现实生活场景中,缺少数据是一个非常大的问题。缺失数据也可以指熊猫中的 NA(不可用)值。在 DataFrame 中,有时许多数据集只是带着缺失的数据到达,要么是因为它存在但未被收集,要么因为它从未存在。例如,假设被调查的不同用户可能选择不分享他们的收入,一些用户可能选择不分享地址,这样很多数据集就丢失了。

在 Pandas 中,缺失数据由两个值表示:

  • None:None 是一个 Python 单例对象,通常用于 Python 代码中的缺失数据。
  • NaN :NaN(Not a Number 的首字母缩写词),是所有使用标准 IEEE 浮点表示的系统都可以识别的特殊浮点值

Pandas 将 None 和 NaN 视为本质上可以互换以指示缺失值或空值。为了促进这一约定,Pandas DataFrame 中有几个用于检测、删除和替换空值的有用函数:

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

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

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

使用 isnull() 检查缺失值

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

# importing pandas as pd
import pandas as pd
# importing numpy as np
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)
# 使用 isnull() 函数
df.isnull()

输出:  

image.png  

代码 #2:

# importing pandas package
import pandas as pd
# 从csv文件制作数据框
data = pd.read_csv("employees.csv")
# 为 NaN 值创建布尔系列 True
bool_series = pd.isnull(data["Gender"])
# 过滤数据仅显示 Gender = NaN 的数据
data[bool_series]

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

image.png  

使用 notnull() 检查缺失值

为了检查 Pandas Dataframe 中的空值,我们使用 notnull() 函数,该函数返回布尔值的数据帧,对于 NaN 值是 False。

代码#3:

# importing pandas as pd
import pandas as pd
# importing numpy as np
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()

输出:  

image.png  

代码 #4:

# importing pandas package
import pandas as pd
# 从csv文件制作数据框
data = pd.read_csv("employees.csv")
# 为 NaN 值创建布尔系列 True
bool_series = pd.notnull(data["Gender"])
# 过滤数据,仅显示 Gender = Not NaN 的数据
data[bool_series]

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

image.png  

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

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

# importing pandas as pd
import pandas as pd
# importing numpy as np
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)

输出:  

image.png  

代码 #2:

用之前的值填充空值

# importing pandas as pd
import pandas as pd
# importing numpy as np
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')

输出:  

image.png  

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

# importing pandas as pd
import pandas as pd
# importing numpy as np
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')

输出:  

image.png  

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

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

image.png

现在我们将用“No Gender”填充 Gender 列中的所有空值

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

输出:  

image.png

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

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

输出:  

image.png

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

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

输出:  

image.png  

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

# importing pandas as pd
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

image.png

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

# 插入缺失值
df.interpolate(method ='linear', limit_direction ='forward')

输出:  

image.png

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

使用 dropna() 删除缺失值

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

# importing pandas as pd
import pandas as pd
# importing numpy as np
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

image.png

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

# importing pandas as pd
import pandas as pd
# importing numpy as np
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()

输出:  

image.png

代码 #2: 如果该行中的所有值都丢失,则删除行。

# importing pandas as pd
import pandas as pd
# importing numpy as np
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

image.png

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

# importing pandas as pd
import pandas as pd
# importing numpy as np
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')

输出:  

image.png

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

# importing pandas as pd
import pandas as pd
# importing numpy as np
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

image.png

现在我们删除至少有 1 个缺失值的列

# importing pandas as pd
import pandas as pd
# importing numpy as np
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)

输出:

image.png  

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

# importing pandas module
import pandas as pd
# 从csv文件制作数据框
data = pd.read_csv("employees.csv")
# 使用丢弃的 NA 值制作新数据框
new_data = data.dropna(axis = 0, how ='any')
new_data

输出:  

image.png

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

print("Old data frame length:", len(data))
print("New data frame length:", len(new_data))
print("Number of rows with at least 1 NA value: ", (len(data)-len(new_data)))

输出 :

Old data frame length: 1000
New data frame length: 764
Number of rows with at least 1 NA value:  236

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


目录
相关文章
|
3月前
|
数据采集 Web App开发 数据可视化
Python零基础爬取东方财富网股票行情数据指南
东方财富网数据稳定、反爬宽松,适合爬虫入门。本文详解使用Python抓取股票行情数据,涵盖请求发送、HTML解析、动态加载处理、代理IP切换及数据可视化,助你快速掌握金融数据爬取技能。
1764 1
|
3月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
317 0
|
3月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
485 0
|
3月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
3月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
4月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
数据处理 Python
如何使用Python的Pandas库进行数据排序和排名
【4月更文挑战第22天】Pandas Python库提供数据排序和排名功能。使用`sort_values()`按列进行升序或降序排序,如`df.sort_values(by='A', ascending=False)`。`rank()`函数用于计算排名,如`df['A'].rank(ascending=False)`。多列操作可传入列名列表,如`df.sort_values(by=['A', 'B'], ascending=[True, False])`和分别对'A'、'B'列排名。
465 2
|
索引 Python
如何使用Python的Pandas库进行数据合并和拼接?
Pandas的`merge()`函数用于数据合并,如示例所示,根据'key'列对两个DataFrame执行内连接。`concat()`函数用于数据拼接,沿轴0(行)拼接两个DataFrame,并忽略原索引。
373 2
|
数据处理 Python
如何使用Python的Pandas库进行数据排序和排名?
Pandas在Python中提供数据排序和排名功能。使用`sort_values()`进行排序,如`df.sort_values(by='A', ascending=False)`进行降序排序;用`rank()`进行排名,如`df['A'].rank(ascending=False)`进行降序排名。多列操作可传入列名列表,如`df.sort_values(by=['A', 'B'], ascending=[True, False])`。
471 6
|
数据挖掘 索引 Python
如何在Python中,Pandas库实现对数据的时间序列分析?
【4月更文挑战第21天】Pandas在Python中提供了丰富的时间序列分析功能,如创建时间序列`pd.date_range()`,转换为DataFrame,设置时间索引`set_index()`,重采样`resample()`(示例:按月`'M'`和季度`'Q'`),移动窗口计算`rolling()`(如3个月移动平均)以及季节性调整`seasonal_decompose()`。这些工具适用于各种时间序列数据分析任务。
316 2

推荐镜像

更多