2015-06-04 57 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