用范围内的随机值替换 NaN

时间:2021-03-22 22:11:13

标签: python pandas dataframe random jupyter-notebook

我正在使用此代码将 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)

由于某种原因它不起作用,没有任何变化

result

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您应该改用 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)

答案 2 :(得分:1)

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

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系列中的单个元素,虽然你也可以使用pandas或numpy以外的包,但只要你在处理pandas对象,它仍然是使用pandas函数的推荐方式。这有助于您编写惯用的 Pandas 代码,并在导入额外的补充包时为您节省一些系统资源(内存和处理时间)。