真实数据中常出现缺失。Pandas 用 np.nan 表示缺失值。检测使用数据框的 isna() 或 isnull() 方法,二者输出结果相同,返回一个布尔型数据框,标识哪些位置有缺失值,True 对应位置即为缺失。课程示例先用含 np.nan 的二维数组构造数据框,行标签为一月至四月,列标签为美好集团、北方通信、广东科技:
import numpy as np
from pandas import DataFrame
a = np.array([[163, 113, 158],
[np.nan, np.nan, 119],
[193, 127, np.nan],
[109, 126, 110]])
df = DataFrame(a, index=['一月', '二月', '三月', '四月'],
columns=['美好集团', '北方通信', '广东科技'])
df.isna()
二月的美好集团与北方通信、三月的广东科技为 True,其余为 False。
处理缺失值的方式取决于数据分析的需求。常用方法包括:使用 dropna() 删除包含缺失值的行或列;使用 fillna() 用特定值(如均值、中位数或前后值)填充。dropna() 默认删除有缺失值的行并返回新数据框,不修改原对象。上例 df.dropna() 只保留一月、四月两行完整记录,二月、三月因含缺失被删。
fillna() 有多种填充策略。df.fillna(0) 用 0 填充,二月美好集团、北方通信与三月广东科技均变为 0.0。课程写法 df.fillna(method='ffill') 用缺失值前面的值填充:二月美好集团、北方通信分别变为 163.0、113.0,三月广东科技变为 119.0;method='bfill' 指定用后面的值填充。df.fillna(value=df.mean()) 用所在列的平均值填充,美好集团、北方通信、广东科技的列均值分别为 155.0、122.0、129.0。较新版本 pandas 中 fillna(method=...) 已改为直接调用 df.ffill() / df.bfill(),填充结果与课程示例相同。
易错点:isna() 与 isnull() 等价,不要当成两种不同检测;dropna()、fillna() 默认返回新对象,未赋值回原变量时原数据框仍含缺失;ffill 是前向(前面的值)、bfill 是后向(后面的值),方向不要记反;均值按列计算,不是全表一个数;删除会减少样本,填充会引入假定,需按分析目的选择,不能一律删行或一律填 0。
isna() 与 isnull() 检测缺失值,返回布尔型数据框,结果相同;True 表示该位置缺失。dropna() 删除含缺失的行或列,默认删行并返回新数据框,原对象不变。fillna(0) 用 0 填充;method='ffill'(或 ffill())用前面的值;method='bfill'(或 bfill())用后面的值。fillna(value=df.mean()) 用所在列平均值填充(本例为 155.0、122.0、129.0)。