问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Pandas DataFrame缺失值处理:4种核心方法详解

创作时间:
作者:
@小白创作中心

Pandas DataFrame缺失值处理:4种核心方法详解

引用
1
来源
1.
https://www.cda.cn/discuss/post/details/5f42745ade734f52c64cf48d

数据清洗是数据分析项目中至关重要的一环,其中处理缺失值是数据清洗的核心任务之一。本文将详细介绍Pandas库中处理DataFrame缺失值的四种主要方法:删除缺失值(dropna)、替换缺失值(fillna)、判断缺失值(isna)和判断非缺失值(notna)。通过具体的代码示例,帮助读者掌握这些实用的函数用法。

1. 相关函数

2. 删除缺失值:dropna函数

dropna函数的参数列表如下:

DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None, inplace=False)

示例数据:

import numpy as np
import pandas as pd

df = pd.DataFrame({
    "name": ['Alfred', 'Batman', 'Catwoman'],
    "toy": [np.nan, 'Batmobile', 'Bullwhip'],
    "born": [pd.NaT, pd.Timestamp("1940-04-25"), pd.NaT]
})

print(df)
#        name        toy       born
# 0    Alfred        NaN        NaT
# 1    Batman  Batmobile 1940-04-25
# 2  Catwoman   Bullwhip        NaT

使用示例

  1. dropna默认参数。删除含有NA的行。其中axis=0表示删除行,how='any'表示有一个NA就删除整行/列。
df.dropna()
#      name        toy       born
# 1  Batman  Batmobile 1940-04-25
  1. 删除含有NA的列。参数axis=1或axis='columns'。
df.dropna(axis='columns')
#        name
# 0    Alfred
# 1    Batman
# 2  Catwoman
  1. 当所有行/列为NA时才删除。参数how='all'。
df.dropna(how='all')
#        name        toy       born
# 0    Alfred        NaN        NaT
# 1    Batman  Batmobile 1940-04-25
# 2  Catwoman   Bullwhip        NaT
  1. 提高删除NA的阈值。参数thresh=2,表示行/列中的NA数量大于2才删除。
df.dropna(thresh=2)
#        name        toy       born
# 1    Batman  Batmobile 1940-04-25
# 2  Catwoman   Bullwhip        NaT
  1. 设置判断的子集。参数subset设置待判断的列/行名,这些列/行中有NA值则所在行/列被删除。
df.dropna(subset=['name', 'born'])
#      name        toy       born
# 1  Batman  Batmobile 1940-04-25
  1. 将处理后的df替换原本的df。参数inplace=True。
df.dropna(inplace=True)
df
#      name        toy       born
# 1  Batman  Batmobile 1940-04-25

3. 替换缺失值:fillna函数

fillna函数的参数列表如下:

DataFrame.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

示例数据:

import numpy as np
import pandas as pd

df = pd.DataFrame([
    [np.nan, 2, np.nan, 0],
    [3, 4, np.nan, 1],
    [np.nan, np.nan, np.nan, 5],
    [np.nan, 3, np.nan, 4]
], columns=list('ABCD'))

print(df)
#      A    B   C  D
# 0  NaN  2.0 NaN  0
# 1  3.0  4.0 NaN  1
# 2  NaN  NaN NaN  5
# 3  NaN  3.0 NaN  4

使用示例

  1. fillna默认参数。传入值,填充所有NA。
df.fillna(0)
#      A    B    C  D
# 0  0.0  2.0  0.0  0
# 1  3.0  4.0  0.0  1
# 2  0.0  0.0  0.0  5
# 3  0.0  3.0  0.0  4
  1. 设定每列NA的填充值。value为字典格式。
values = {'A': 0, 'B': 1, 'C': 2, 'D': 3}
df.fillna(value=values)
#      A    B    C  D
# 0  0.0  2.0  2.0  0
# 1  3.0  4.0  2.0  1
# 2  0.0  1.0  2.0  5
# 3  0.0  3.0  2.0  4
  1. 用前向值/后向值填充NA。method='fillna'表示NA被前一个值填充。例如A列2行的NA被A列1行的3.0填充,B列2行的NA被B列1行的4.0填充。
df.fillna(method='ffill')
#      A    B   C  D
# 0  NaN  2.0 NaN  0
# 1  3.0  4.0 NaN  1
# 2  3.0  4.0 NaN  5
# 3  3.0  3.0 NaN  4
  1. 设定每列/行的填充数。limit=1表示每列/行仅仅填充1个NA。
df.fillna(value=values, limit=1)
#      A    B    C  D
# 0  0.0  2.0  2.0  0
# 1  3.0  4.0  NaN  1
# 2  NaN  1.0  NaN  5
# 3  NaN  3.0  NaN  4
  1. 参数axis和inplace与dropna相同。

4. 判断缺失值:isna函数

  1. 判断df中所有值是否为NA。
df.isna()
#     name    toy   born
# 0  False   True   True
# 1  False  False  False
# 2  False  False   True
  1. 判断某一列(series格式)的值是否为NA。
df['toy'].isna()
# 0     True
# 1    False
# 2    False
# Name: toy, dtype: bool

5. 判断缺失值:notna函数

与isna的结果完全相反,用法一样。

df.notna()
#    name    toy   born
# 0  True  False  False
# 1  True   True   True
# 2  True   True  False

df['toy'].notna()
# 0    False
# 1     True
# 2     True
# Name: toy, dtype: bool
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号