pandas 用随机值替换 Dataframe 中的NaN

vptzau2j  于 2023-06-20  发布在  其他
关注(0)|答案(9)|浏览(143)

我有一个具有NaN值的 Dataframe (data_train),下面给出了一个示例:

republican                n                          y   
republican                n                          NaN   
democrat                 NaN                         n
democrat                  n                          y

我想用一些随机值替换所有的NaN。

republican                n                           y   
republican                n                          rnd2
democrat                 rnd1                         n
democrat                  n                           y

我该怎么做。
我尝试了以下方法,但没有成功:

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)]

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

tjrkku2a

tjrkku2a1#

您可以使用#波浪号运算符随机填充值

df['column'].dropna()
df["column"].fillna(np.random.choice(df['column'][~df['column'].isna()]),inplace = True)
nxowjjhe

nxowjjhe2#

在循环中使用fillna()并将'limit'属性设置为1可以帮助用不同的随机值替换nan。

import random
while(Series.isnull().sum()!=0):
    Series.fillna(random.uniform(0,100),inplace=True,limit=1)
yqlxgs2m

yqlxgs2m3#

试试我的代码。我将前面的答案结合到工作示例中:

M = len(data_train.index)
  N = len(data_train.columns)
  df_rand = pd.DataFrame(np.random.randn(M,N), columns=data_train.columns, index=data_train.index)
  data_train[pd.isnull(data_train)] = df_rand[pd.isnull(data_train)]

它比使用apply_map更快。

ctrmrzij

ctrmrzij4#

如果随机,你实际上意味着/需要唯一的值,那么这个快速解决方案可以与各种进一步的快速修改一起工作:

mask = df[col].isnull()
df[col][mask] = df[col][mask].index#.astype(str).str.etc...
mbzjlibv

mbzjlibv5#

只需这样使用fillna

import random
data_train.fillna(random.random())
rekjcdws

rekjcdws6#

如果你想用列表中的随机值替换DF中的所有NaN,你可以这样做:

import numpy as np

df.applymap(lambda l: l if not np.isnan(l) else np.random.choice([1, 3]))
pxyaymoc

pxyaymoc7#

好吧,如果你用fillna来填充NaN,一个随机生成器只工作一次,并且会用相同的数字填充所有的N/A。
因此,请确保每次生成并使用一个随机数。对于这样的dataframe:

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

我使用下面的代码来填充A列中的NaNs

import random
x['A'] = x['A'].apply(lambda v: random.random() * 1000)

这将给予我们这样的东西:

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
ep6jt1vc

ep6jt1vc8#

您可以使用pandas update命令,如下所示:
1)生成一个随机DataFrame,其列和索引与原始数据相同:

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)

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

df.update(ran)

在上面的例子中,我使用了标准法线的值,但你也可以使用从原始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)
zyfwsgd6

zyfwsgd69#

如果你想用热甲板技术取代你的专栏中的NaN,我可以提出这样的方法:

def hot_deck(dataframe) :
    dataframe = dataframe.fillna(0)
    for col in dataframe.columns :
        assert (dataframe[col].dtype == np.float64) | (dataframe[col].dtype == np.int64)
        liste_sample = dataframe[dataframe[col] != 0][col].unique()
        dataframe[col] = dataframe.apply(lambda row : random.choice(liste_sample) if row[col] == 0 else row[col],axis=1)
    return dataframe

如果你喜欢在每次迭代中用一个新的随机值替换NaN,你可以做这样的事情。你只需要确定随机选择的最大值。

def hot_deck(dataframe,max_value) :
    dataframe = dataframe.fillna(0)
    for col in dataframe.columns :
        assert (dataframe[col].dtype == np.float64) | (dataframe[col].dtype == np.int64)
        liste_sample = random.sample(range(max_value),dataframe.isnull().sum())
        dataframe[col] = dataframe.apply(lambda row : random.choice(liste_sample) if row[col] == 0 else row[col],axis=1)
    return dataframe

相关问题