Pandas 基础 (5) —— 处理缺失数据及层次化索引

本文详细介绍如何使用Python的Pandas库处理数据集中的缺失值。包括使用NaN和None表示缺失数据,通过isnull和notnull方法检测缺失值,利用dropna方法滤除或保留部分数据,以及使用fillna方法填充缺失值。适用于数据预处理和清洗任务。

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

  1. 处理缺失数据

    pandas 使用浮点值 NaN (Not a Number)表示浮点和非浮点数组中的缺失数据。它只是一个便于被检测出来的标记而已。

    In [168]: data = Series(['a','b',np.nan,'d'])
    
    In [169]: data
    Out[169]: 
    0      a
    1      b
    2    NaN
    3      d
    dtype: object
    
    In [170]: data.isnull()
    Out[170]: 
    0    False
    1    False
    2     True
    3    False
    dtype: bool
    

    Python 内置的 None 值也会被当做 NA 处理:

    In [171]: data[0] = None
    
    In [172]: data.isnull()
    Out[172]: 
    0     True
    1    False
    2     True
    3    False
    dtype: bool
    

NA处理方法

  1. 滤除缺失数据

    对于 Series,dropna 返回一个仅含非空数据和索引值的 Series:

    In [173]: data
    Out[173]: 
    0    None
    1       b
    2     NaN
    3       d
    dtype: object
    
    In [174]: data.dropna()
    Out[174]: 
    1    b
    3    d
    dtype: object
    # 也可以通过布尔型索引达到这个目的
    In [175]: data[data.notnull()]
    Out[175]: 
    1    b
    3    d
    dtype: object
    

    而对于 DataFrame 对象,稍微有点复杂,dropna 默认会丢弃任何含有缺失值的行:

    In [176]: data = DataFrame([[1,2,3],[1,np.nan,np.nan],
         ...: [np.nan,np.nan,np.nan],[np.nan,4,5]])
    
    In [177]: cleaned = data.dropna()
    
    In [178]: data
    Out[178]: 
         0    1    2
    0  1.0  2.0  3.0
    1  1.0  NaN  NaN
    2  NaN  NaN  NaN
    3  NaN  4.0  5.0
    
    In [179]: cleaned
    Out[179]: 
         0    1    2
    0  1.0  2.0  3.0
    
    # 传入 how='all' 将只丢弃全为 NA 的那些行
    In [181]: data.dropna(how='all')
    Out[181]: 
         0    1    2
    0  1.0  2.0  3.0
    1  1.0  NaN  NaN
    3  NaN  4.0  5.0
    

    要丢弃列,需要传入 axis=1,表示在列上生效:

    In [183]: data[4] = np.nan
    
    In [184]: data
    Out[184]: 
         0    1    2   4
    0  1.0  2.0  3.0 NaN
    1  1.0  NaN  NaN NaN
    2  NaN  NaN  NaN NaN
    3  NaN  4.0  5.0 NaN
    
    In [185]: data.dropna(axis=1,how='all')
    Out[185]: 
         0    1    2
    0  1.0  2.0  3.0
    1  1.0  NaN  NaN
    2  NaN  NaN  NaN
    3  NaN  4.0  5.0
    

  2. 填充缺失数据

    要填充缺失的数据,主要使用 fillna 方法,通过调用 fillna(Number) 就会将缺失值替换为 Number 数值。

    In [186]: df
    Out[186]: 
       one  two
    a  1.0  NaN
    b  2.0  3.0
    c  NaN  NaN
    d  0.0  2.0
    
    In [187]: df.fillna(100)
    Out[187]: 
         one    two
    a    1.0  100.0
    b    2.0    3.0
    c  100.0  100.0
    d    0.0    2.0
    # fillna 默认会返回新对象,但是传入 inplace=True 会对原有对象进行就地修改
    In [188]: df.fillna(200,inplace=True)
    
    In [189]: df
    Out[189]: 
         one    two
    a    1.0  200.0
    b    2.0    3.0
    c  200.0  200.0
    d    0.0    2.0
    

\fillna函数的参数说明

  1. 层次化索引

    P164​

### Pandas使用标签方法处理缺失值 在 Pandas 数据分析过程中,可以利用特定的 **标签方法** 来处理缺失值。这种方法通常涉及通过索引或列名定位数据并执行操作。以下是关于如何使用标签方法(`loc` 或 `iloc`)结合其他功能来处理缺失值的具体方式。 #### 利用 `loc` 进行基于标签的操作 Pandas 提供了灵活的数据访问机制,其中 `loc` 可以用来按照行列的标签选取子集,并在此基础上应用缺失值处理逻辑。例如: ```python import pandas as pd import numpy as np df = pd.DataFrame({ 'A': [1, 2, np.nan, 4], 'B': [5, np.nan, np.nan, 8], 'C': [9, 10, 11, 12] }, index=['row1', 'row2', 'row3', 'row4']) # 使用 loc 定位某一行某一列并填充缺失值 df.loc['row2', 'B'] = df.loc['row2', 'B'].fillna(7) # 填充单个单元格中的缺失值[^5] print(df) ``` 上述代码展示了如何针对具体位置上的缺失值进行替换操作。这里需要注意的是,在实际场景下,如果目标区域较大,则可以通过批量方式进行替代。 #### 结合条件筛选与标签方法 除了简单的定点修改外,还可以先定义某些条件再配合标签完成复杂任务。比如只对满足一定标准的部分实施填补动作: ```python # 对 A 列中小于等于其均值的所有 NaN 替换成该列平均数 mean_A = df['A'].mean() mask = (df['A'] <= mean_A) df.loc[mask & df['A'].isnull(), 'A'] = mean_A # 应用掩码过滤器[^2] print(df) ``` 此片段说明了当需要依据额外约束来进行精细化控制时的做法——即创建布尔型 Mask 后将其应用于 `.loc[]` 上实现精准定位。 #### 插入新行/列的同时设定初始状态为空值 另外一种情况是在构建新的特征维度期间就考虑好潜在可能出现空白的情形;此时可以直接赋初值而事后补救: ```python # 添加一列 D 并初始化所有元素均为某个常量 df['D'] = 0 print(df) ``` 以上三种情形分别代表不同层次上运用“标签”概念解决丢失信息问题的实际案例。每种都有各自适用范围以及优缺点考量因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wohu007

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

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

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

打赏作者

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

抵扣说明:

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

余额充值