Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用随机值替换数据帧中的NaN_Python_Pandas - Fatal编程技术网

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

Python 用随机值替换数据帧中的NaN,python,pandas,Python,Pandas,我有一个带有NaN值的数据帧(data_train),下面给出了一个示例: republican n y republican n NaN democrat NaN n democrat n

我有一个带有NaN值的数据帧(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)]

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

只需使用
fillna
这种方式即可

随机导入
数据\u train.fillna(random.random())

如果使用
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
我使用以下代码填写A列中的
NAN

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
可以通过以下方式使用pandas命令:

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)
2) 然后使用
update
,以便将
df
中的NaN值替换为生成的随机值

df.update(ran)

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

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)

如果你想用热甲板技术取代专栏中的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

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

import numpy as np

df.applymap(lambda l: l if not np.isnan(l) else np.random.choice([1, 3]))
在循环内使用fillna()并将“limit”属性设置为1有助于用不同的随机值替换nan

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

可以使用#tilde运算符随机填充值

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

你的代码对我有用,你确实有一个小的输入错误:
data\u train[pd.isnull(data\u train)]=df\u rand[pd.isnull(data\u train)]
Hi EdChum,我知道了,这是一个复制粘贴错误,不管怎样,代码对我来说仍然不起作用。。如果数据帧(data_train)和数据帧(df_train)的列名不同,这有关系吗?是的,它起作用了,两个数据帧的列名应该是相同的…ThanksHi farhawa,上面的代码将用选择的相同随机数填充每个NaN,但是我需要为每个NaN设置不同的随机数。原始海报想要“用一些随机值替换所有NaN,如”。您的解决方案将用随机值替换所有NAN。这可能不是一个好的解决方案,如果您希望保留列“a”的原始数据,但此方法也会更改原始数据,该怎么办。