HOWTO · Pandas

如何在 Pandas DataFrame 的列中将所有 NaN 值替换为零

在 Pandas 库中使用 df.fillna(),df.replace()方法在 DataFrame 中将 NaN 值替换为零

本页内容

要替换 pandas DataFrame 某一列中的缺失值,请先选中该列,调用 fillna(0),再将返回的 Series 赋回同一列:df["A"] = df["A"].fillna(0)。这样只会修改列 A,其他列的值保持不变。df.fillna() 也可以填充整个 DataFrame 中的缺失值,因此任务只涉及一列时,先选出 Series 很重要。若要在所选 Series 中匹配并替换特定值,也可以使用 df.replace()。

使用 fillna() 替换单列中的 NaN 值

fillna() 会将 pandas 识别为缺失值的项替换为你指定的值。在这个示例中,pandas 创建 DataFrame 时,会将数值列中的 None 表示为缺失值。将 fillna(0) 的结果赋回 df["A"],替换才会反映在 df 中;如果调用方法后不赋值,DataFrame 变量不会因此改变。第二列用于对照,其缺失值会保留下来。

运行此示例。代码和输出中的文字标签保持英文:

本节中的代码以及显示的标签或输出仍为英文。

import pandas as pd

df = pd.DataFrame({
    "A": [1, 2, None, 4],
    "B": [None, 2, 3, 4],
})

df["A"] = df["A"].fillna(0)
print(df.to_string())
     A    B
0  1.0  NaN
1  2.0  2.0
2  0.0  3.0
3  4.0  4.0

输出显示,列 A 中的缺失值变成了 0.0,而列 B 中的缺失值仍为 NaN。输出里的文字标签保持英文。对你自己的 DataFrame 和目标列,也可以使用相同的赋值方式。fillna() 还接受其他替换值,并支持向前或向后填充等策略;只有当这些方式符合数据的含义和顺序时才使用。如果对整个 DataFrame 调用 df.fillna(0),填充范围会覆盖其中各列的缺失值,而不只是列 A。

使用 replace() 替换单列中的 NaN 值

如果要替换某个特定值或一组值,也可以使用 replace()。若要针对 Series 中的缺失值,可以调用 df["A"].replace(float("nan"), 0),再将返回的 Series 赋回 df["A"]。此处明确提供了 NaN 值;不要假设 replace() 总会将 None 视为 NaN。与 fillna() 一样,在选中的 Series 上调用该方法,操作范围就限定在那一列上。对整个 DataFrame 调用 df.replace(...),则可能影响多个列中符合条件的值。

对于这个任务,fillna() 更直接地表达了填充缺失值的意图。当需要按值匹配时,可以选择 replace(),例如还要将所选列中的某个已知占位符统一替换。若后续代码需要使用更改后的数据,两种示例都应将返回结果赋值;这种写法不需要 inplace=True。

选择适合数据的替换值

只有当零符合分析中缺失观测值的含义时,才适合用零替换。例如,缺失的计数若表示没有事件发生,零可能合适;但如果缺失表示“未知”,填入零就可能扭曲测量结果。根据列的内容和分析目的,其他常量、领域中特定的值,或均值、中位数等统计量可能更合适。填充前先确定应如何解释缺失值,因为替换之后,缺失观测值与真实的零值将无法区分。

替换值也必须适合该列的数据类型。数值零适用于数值列;若给文本列填入零,pandas 对数据的表示或处理方式可能会改变。如果后续计算依赖数值类型,请检查结果的 dtype。这里的示例只填充选中的列,这有助于你在决定替换值时避免改动无关数据。

检查结果

查看目标列 df["A"],或显示整个 DataFrame,以确认预期的值已经改变。若要统计该列中剩余的缺失值,可以使用 df["A"].isna().sum();计数为零表示该 Series 中不再有 pandas 识别的缺失值。这个检查无法判断零是否是正确的分析选择,因此也要确认替换值符合数据的含义。如果计数不为零,请确认选中了预期的列,并已将方法返回的 Series 赋回该列。