用随机值替换数据帧中的 NaN

Sam*_*Sam 6 python pandas

我有一个带有 NaN 值的数据框 (data_train),下面给出了一个示例:

republican                n                          y   
republican                n                          NaN   
democrat                 NaN                         n
democrat                  n                          y   
Run Code Online (Sandbox Code Playgroud)

我想用一些随机值替换所有的 NaN,比如 .

republican                n                           y   
republican                n                          rnd2
democrat                 rnd1                         n
democrat                  n                           y   
Run Code Online (Sandbox Code Playgroud)

我该怎么做。

我尝试了以下操作,但没有运气:

df_rand = pd.DataFrame(np.random.randn(data_train.shape[0],data_train.shape[1]))
data_train[pd.isnull(data_train)] = dfrand[pd.isnull(data_train)]
Run Code Online (Sandbox Code Playgroud)

当我使用带有随机数字数据的数据框执行上述操作时,上述脚本工作正常。

mas*_*-g3 7

如果您想用列表中的随机值替换 DF 中的所有 NaN,您可以执行以下操作:

import numpy as np

df.applymap(lambda l: l if not np.isnan(l) else np.random.choice([1, 3]))
Run Code Online (Sandbox Code Playgroud)


fix*_*xer 6

好吧,如果你fillna用来填充NaN,随机生成器只会工作一次,并且会用相同的数字填充所有 N/As。

因此,请确保每次生成并使用随机数。对于这样的数据框:

          Date         A       B
0   2015-01-01       NaN     NaN
1   2015-01-02       NaN     NaN
2   2015-01-03       NaN     NaN
3   2015-01-04       NaN     NaN
4   2015-01-05       NaN     NaN
5   2015-01-06       NaN     NaN
6   2015-01-07       NaN     NaN
7   2015-01-08       NaN     NaN
8   2015-01-09       NaN     NaN
9   2015-01-10       NaN     NaN
10  2015-01-11       NaN     NaN
11  2015-01-12       NaN     NaN
12  2015-01-13       NaN     NaN
13  2015-01-14       NaN     NaN
14  2015-01-15       NaN     NaN
15  2015-01-16       NaN     NaN
Run Code Online (Sandbox Code Playgroud)

我使用以下代码填写NaNsA 列中的内容:

import random
x['A'] = x['A'].apply(lambda v: random.random() * 1000)
Run Code Online (Sandbox Code Playgroud)

这会给我们一些类似的东西:

          Date           A       B
0   2015-01-01   96.538211     NaN
1   2015-01-02  404.683392     NaN
2   2015-01-03  849.614253     NaN
3   2015-01-04  590.030660     NaN
4   2015-01-05  203.167519     NaN
5   2015-01-06  980.508258     NaN
6   2015-01-07  221.088002     NaN
7   2015-01-08  285.013762     NaN
Run Code Online (Sandbox Code Playgroud)

  • 可能这不是一个好的解决方案,如果您想保留“A”列的原始数据怎么办,但这种方法也会改变原始数据。 (5认同)

Abr*_*odj 5

您可以通过以下方式使用 pandas update命令:

1)生成一个与原始数据帧具有相同列和索引的随机数据帧:

import numpy as np; import pandas as pd
M = len(df.index)
N = len(df.columns)
ran = pd.DataFrame(np.random.randn(M,N), columns=df.columns, index=df.index)
Run Code Online (Sandbox Code Playgroud)

2) 然后使用update,这样 中的 NaN 值df将被生成的随机值替换

df.update(ran)
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我使用了标准法线中的值,但您也可以使用从原始 DataFrame 中随机选取的值:

import numpy as np; import pandas as pd

M = len(df.index)
N = len(df.columns)

val = np.ravel(df.values)
val = val[~np.isnan(val)]
val = np.random.choice(val, size=(M,N))
ran = pd.DataFrame(val, columns=df.columns, index=df.index)

df.update(ran)
Run Code Online (Sandbox Code Playgroud)

  • 据我了解 - 您的方法将所有值替换为随机值,而不仅仅是 Nan 值 (2认同)

far*_*awa -1

只需使用fillna这种方式

import random
data_train.fillna(random.random())
Run Code Online (Sandbox Code Playgroud)

  • 你好,farhawa,上面的代码将使用所选的相同随机数填充每个 NaN,但是我需要它为每个 NaN 提供不同的随机数。 (10认同)