【问题标题】:Replace NaN with random number用随机数替换 NaN
【发布时间】:2021-05-05 13:45:03
【问题描述】:

我有一个数字数据框,例如:

A           B
2019-10-31  0.035333
2019-10-31  NaN
2019-11-30  -0.108532
2019-11-30  -0.030604
2019-11-30  NaN

我想用随机高斯数替换 B 列中的 NaN:

from random import seed
from random import gauss
# seed random number generator
seed(1)
# generate some Gaussian value
value = gauss(0, 0.1)

但是,如果我使用以下代码:

df.fillna(gauss(0, 0.1))

它用相同的随机值填充所有缺失值,而我希望每个 NaN 都有一个新的随机值。我应该如何实现这一点?

【问题讨论】:

标签: python pandas random fillna


【解决方案1】:

您可以使用np.random 生成整个数组,然后使用loc 填充nan:

mask = df['B'].isna()

to_fill = np.random.normal(0,0.1, size=mask.sum())
df.loc[mask, 'B'] = to_fill

【讨论】:

    【解决方案2】:

    或者如果你只是想使用gauss:

    df['B'] = df['B'].fillna(df['B'].apply(lambda x: gauss(0,.1)))
    

    输出:

                A         B
    0  2019-10-31  0.035333
    1  2019-10-31 -0.143683
    2  2019-11-30 -0.108532
    3  2019-11-30 -0.030604
    4  2019-11-30  0.054647
    

    【讨论】:

      【解决方案3】:

      Python pandas 建议替换函数。

      df.replace('NaN', gauss(1, 0.1))
      

      输出:

                  A         B
      0  2019-10-31  0.035330
      1  2019-10-31 -0.036289
      2  2019-11-30 -0.108532
      3  2019-11-30 -0.030604
      4  2019-11-30 -0.036289
      

      【讨论】:

        【解决方案4】:
        df.B.where(df.B.notna(), np.random.randn(len(df.index))*0.1 + 0)
        

        如果B 列不是 NaN,则取自 np.random.randn,否则保持原样

        得到

        0    0.035333
        1   -0.006504
        2   -0.108532
        3   -0.030604
        4   -0.337191
        Name: B, dtype: float64
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-02-07
          • 1970-01-01
          • 2012-06-24
          • 2020-08-14
          • 2010-11-03
          • 2010-12-13
          相关资源
          最近更新 更多