我有一个带有 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)
当我使用带有随机数字数据的数据框执行上述操作时,上述脚本工作正常。
如果您想用列表中的随机值替换 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)
好吧,如果你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)
您可以通过以下方式使用 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)
far*_*awa -1
只需使用fillna这种方式
import random
data_train.fillna(random.random())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15384 次 |
| 最近记录: |