2015-06-04 58 views
2

我有NaN值的数据帧(data_train)中,A样品如下:替换的NaN在数据帧与随机值

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

当我做以上与随机数值数据的数据框上面的脚本能正常工作。

+1

你的代码适用于我,你有一个小错字:'data_train [pd.isnull(data_train)] = df_rand [pd。isnull(data_train)]' – EdChum

+0

嗨EdChum,雅我得到的错字,这是一个复制粘贴错误,反正代码仍然不工作对我来说..如果数据帧(data_train)的列名和数据帧df_train)是不同的。 – Sam

+0

它的工作,似乎两个数据帧的列名称应该是相同的......感谢 – Sam

回答

0

只需使用fillna这样

import random 
data_train.fillna(random.random()) 
+2

嗨farhawa,上面的代码块将填充每个NaN与选择相同的随机数,但我需要它是不同的随机数为每个NaN。 – Sam

2

好吧,如果你使用fillna填补NaN,随机生成的作品只有一次,将填补所有N /与相同的号码。

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

  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 
0

你可以使用熊猫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) 

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

如果要替换楠用热甲板技术的专栏中,我可以建议的方式是这样的:

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