【问题标题】:replace NaN with random values from a range用范围内的随机值替换 NaN
【发布时间】:2026-01-20 19:45:01
【问题描述】:

我正在使用此代码将 NaN 替换为范围内的随机值

import numpy as np
def processNan (x):
     return np.random.choice([1.0, 2.0])
assure['codeTypePieceIdentite'] = assure['codeTypePieceIdentite'].apply(lambda x: processNan(x) if x is nan else x)

由于某种原因它无法正常工作,没有任何变化

【问题讨论】:

  • 使用np.nan 而不是nan 进行测试?
  • 实际上必须使用接受的答案中提到的 math.isnan(x)
  • 要编写惯用的 pandas 代码,只要您正在处理 pandas 对象,就应该考虑使用 pd.isna(x)。请参阅下面的解释。

标签: python pandas dataframe random jupyter-notebook


【解决方案1】:

尽可能避免使用.apply,这不是最佳解决方案,因为它没有利用矢量化。在这种情况下,您可以执行以下操作:

mask = df["codeTypePieceIdentite"].isna()
df.loc[mask, "codeTypePieceIdentite"] = np.random.choice([1,2], mask.sum())

【讨论】:

  • @4212 避免.apply 也是学习其他 pandas 工具的好方法:P
  • 哈哈,你的观点非常好..c:
【解决方案2】:

您应该改用math.isnan(x)

import numpy as np
import math
def processNan (x):
    return np.random.choice([1.0, 2.0])
assure['codeTypePieceIdentite'] = assure['codeTypePieceIdentite'].apply(lambda x: 
processNan(x) if math.isnan(x) else x)

【讨论】:

  • @4212 尽可能避免使用apply,它可能真的很慢。这个解决方案基本上是一个带有嵌套 if 语句的 for 循环
【解决方案3】:

要编写惯用的 pandas 代码,您应该尽可能使用 pandas 或 numpy 包,而不是 Python 内置或其他 Python 补充包。 p>

pandas 提供通用函数pd.isna()pd.notna() 用于检测类数组对象的缺失/非缺失值。您的代码可以修改为使用pd.isna(),如下所示:

assure['codeTypePieceIdentite'] = \
    assure['codeTypePieceIdentite'].apply(lambda x: processNan(x) if pd.isna(x) else x)

使用 pandas 和 numpy 的主要优势在于,它们从其 ndarray 数据类型提供高效的数组处理,该数据类型已针对其基本设计中的性能考虑进行了优化。 numpy 也很常用,因为 pandas 是基于 numpy 构建的。

对于检查 pandas Series 和 DataFrame 的 nan 值,pd.isna()pd.notna() 是显而易见的选择。为了检查 pandas Series 中的单个元素,虽然您也可以使用 pandas 或 numpy 以外的包,但只要您正在处理 pandas 对象,它仍然是使用 pandas 函数的推荐方式。这有助于您编写惯用的 pandas 代码,并在导入额外的补充包时节省一些系统资源(内存和处理时间)。

【讨论】: