pandas处理NaN缺失值

本文介绍如何在数据预处理阶段处理缺失值。主要分为两种方法:删除含有缺失值的样本和替换/插补缺失值。详细解释了如何使用Pandas库中的dropna()和fillna()函数来实现这两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import pandas as pd

缺失值处理

两种方法:

  1. 删除含有缺失值的样本
  2. 替换/插补

处理缺失值为NaN

先判断数据中是否存在NaN,通过下面两个方法中任意一个

pd.isnull(dataframe)
# dataframe为数据
如果数据中存在NaN返回True,如果没有就返回False

pd.notnull(dataframe)
该方法与isnull相反

any()all()
"""
pd.isnull(dataframe).any()
判断哪一个字段中存在缺失值没有就返回False

pd.notnull(dataframe).all()
判断哪一个字段中存在缺失值没有就返回True
"""


使用numpy也可以进行判断


import numpy as np

np.any(pd.isnull(dataframe)) # 如果返回True,说明数据中存在缺失值

np.all(pd.notnull(dataframe)) # 如果返回False, 说明数据中存在缺失值

然后进行数据处理
方式一: 删除空值行

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

"""
函数作用:删除含有空值的行或列
dropna() 是删除空值数据的方法, 默认将只要含有NaN的整行数据删除, 
如果想要删除整行都是空值的数据需要添加how='all'参数

默认是删除整行, 如果对列做删除操作, 需要添加axis参数, 
		axis=1表示删除列, axis=0表示删除行

axis:维度,axis=0表示index行,axis=1表示columns列,默认为0

how:"all"表示这一行或列中的元素全部缺失(为nan)才删除这一行或列,"any"表示这一行或列中只要有元素缺失,就删除这一行或列

thresh:一行或一列中至少出现了thresh个才删除。

subset:在某些列的子集中选择出现了缺失值的列删除,不在子集中的含有缺失值得列或行不会删除(有axis决定是行还是列)

inplace: 是否在当前的dataframe中执行此操作,
		True表示在原来的基础上修改,
		False表示返回一个新的值, 不修改原有数据

"""

方式二: 替换/插补

dataframe.fillna('替换的值value',inplace=False)
'''
把替换NaN的值传入到fillna()中
'''

缺失值NaN有默认标记的值

比如有的空值不是NaN, 有的是一个’?’

先替换
使用numpy把"?"替换为NaN

import numpy as np

# 替换
dataframe.replace(to_replace="?", value=np.nan)

把其他的缺失值换为NaN后, 然后就按照缺失值为NaN的方式就行操作


删除数据

如果只是单独的删除数据可以使用drop()方法

DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)

'''
代码解释:
labels : 就是要删除的行列的名字,用列表指定
index : 直接指定要删除的行
columns : 直接指定要删除的列
inplace=False : 表示返回一个新的值, 不修改原有数据
inplace=True : 表示在原来的基础上修改
'''

例:


import pandas as pd
df = pd.read_csv('/text.xlsx')
# 删除第0行和第1行
df.drop(labels=[0,1],axis=0)

# 删除列名为 age 的列
df.drop(axis=1,columns=age)


<think>我们被要求使用中文回答,并且按照给定的格式要求(行内数学表达式用$...$,独立公式用$$...$$)。用户的问题是关于pandas处理数据集中的缺失值,具体提到了fillna, dropna,interpolate三个方法。根据引用内容,我们可以总结如下:1. fillna:用指定的值填充缺失值(引用[1]和引用[3])2. dropna:删除包含缺失值的行或(引用[4])3.interpolate:插值方法,例如线性插值(引用[3])此外,引用[5]提到了isna和notna用于判断缺失值。回答结构:1.首先介绍缺失值pandas中的表示(NaN, None,NaT等)2.介绍检测缺失值的方法(isna,notna)3.分别详细介绍fillna, dropna,interpolate的使用方法,包括常用参数和示例(根据引用内容提供示例代码4.总结如何选择这些方法注意:引用内容中的示例代码我们可以借鉴,但需要整合并适当修改以符合问题要求。同时,按照要求,在回答末尾生成相关问题。开始回答:</think>### Pandas 处理数据集缺失值的方法 在 Pandas 中,缺失值通常表示为 `NaN`(Not a Number)、`None` 或 `NaT`(时间缺失)。处理缺失值的主要方法包括填充(`fillna`)、删除(`dropna`)和插值(`interpolate`),具体选择取决于数据特性和分析目标。 #### 1. **检测缺失值** - 使用 `isna()` 或 `isnull()` 检测缺失值(返回布尔矩阵)[^5] - 使用 `notna()` 或 `notnull()` 检测非缺失值 ```python import pandas as pd import numpy as np # 创建示例数据 data = {'A': [1, np.nan, 3, None], 'B': [5, 6, None, 8]} df = pd.DataFrame(data) print("缺失值检测:\n", df.isna()) ``` #### 2. **填充缺失值 (`fillna`)** 用指定值替换缺失值: ```python # 用固定值填充(如0) df_filled = df.fillna(0) print("填充0后的数据:\n", df_filled) # 用统计值填充(如均值) df_filled_mean = df.fillna(df.mean()) print("填充均值后的数据:\n", df_filled_mean) # 向前填充(ffill)或向后填充(bfill) df_filled_ffill = df.fillna(method='ffill') # 用前一个非空值填充 ``` **适用场景**:数据集较小或缺失率低时,保留数据完整性[^1]。 #### 3. **删除缺失值 (`dropna`)** 直接删除包含缺失值的行或: ```python # 删除任何包含缺失值的行(默认) df_dropped_rows = df.dropna(axis=0) # 删除任何包含缺失值 df_dropped_cols = df.dropna(axis=1) # 仅删除全为缺失值的行 df_dropped_all_na = df.dropna(how='all') # 设置非缺失值数量阈值(thresh=2表示至少2个非空值才保留) df_dropped_thresh = df.dropna(thresh=2) ``` **适用场景**:缺失率较高或数据量充足时[^4]。 #### 4. **插值 (`interpolate`)** 基于现有值计算缺失值: ```python # 线性插值(默认按索引顺序) df_interpolated = df.interpolate() print("线性插值结果:\n", df_interpolated) # 时间序插值(method='time') time_series = pd.Series([1, None, None, 10], index=pd.date_range('2023', periods=4)) time_series.interpolate(method='time').plot() # 生成插值曲线图 ``` **插值方法**: - `linear`:线性插值(默认) - `polynomial`:多项式插值(需指定`order`) - `spline`:样条插值 - `time`:时间索引插值[^3] **适用场景**:连续型数据(如温度、股价等时间序)。 #### 5. **方法选择建议** | 方法 | 适用场景 | 优点 | 缺点 | |---------------|-----------------------------------|--------------------------|--------------------| | `fillna` | 缺失率低(<5%),需保留数据量 | 操作简单,保留数据完整性 | 可能引入偏差 | | `dropna` | 缺失率高(>20%),数据量充足 | 完全消除缺失值 | 信息损失 | | `interpolate` | 连续变量,有序数据(如时间序) | 利用数据趋势 | 对异常值敏感 | > **关键原则**: > - 检查缺失模式:随机缺失(MCAR)可用插值,非随机缺失(MNAR)需谨慎处理 > - 评估影响:通过比较处理前后的统计分布(如 `df.describe()`)判断处理效果
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值