2017-09-25 65 views
0

我有一個3列的熊貓數據框。使用非缺失數據填充熊貓數據框中兩列的缺失數據

data = data[['id','foo','bar']] 

約1%的數據集foo和bar都丟失,但沒有id。我打算用非零的foobar隨機對進行估算。假設id永遠不爲null,並且foo和bar都爲null或者都爲非null。

+0

隨機數?所以給fillna的任何東西都可以工作? – Evert

+0

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.Imputer.html? – Wen

+0

@Wen,我正在尋找一個隨機插補策略 –

回答

0

你是否想要做類似的事情?

import pandas as pd 
import numpy as np 
index = range(10) 
df = pd.DataFrame(np.random.randn(10,2), index=index, columns=['foo','bar']) 
df['foo'].iloc[0:4] = np.nan 

invalid = df['foo'].isnull() 
nInvalid = df[invalid].shape[0] 
valids = df['foo'][-invalid] 
nValid = valids.shape[0] 
randomInst = np.random.randint(0,nValid,nInvalid) 
df['foo'].loc[invalid] = valids.iloc[randomInst].as_matrix() 

編輯適用於酒吧以及:

df['bar'].loc[invalid] = df['bar'][-invalid].iloc[randomInst].as_matrix() 
+0

關閉!我正在尋找同時填充foo和bar,但也使用df –

+0

中的非空數據我相信這是否意味着您想允許bar中的零件在foo中替換NaN作爲foo的部分? – Michele87

+0

查看我添加的最後一行。這會適合你的情況嗎?假設當foo無效時,酒吧總是且僅有無效 – Michele87

0

這個幫助你嗎?

import pandas as pd 
data = pd.DataFrame(data) 
invalid_data = data[(data['foo'].isnull()) & (data['bar'].isnull())] 
0

假設「富」值丟失時,所述「酒吧」值也被缺失(按您的問題),並且所述列類型是浮點:

mask = df['foo'].isnull() 
df.loc[mask,['foo', 'bar']] = np.random.random((np.sum(mask), 2)) 


如果你想使用有效值從實際數據框本身(因爲它們更能代表你的數據的取值範圍),你可以改用以下:

df.loc[mask,['foo', 'bar']] = df[['foo', 'bar']][~mask].sample(np.sum(mask)).values 

(可能用replace=True作爲sample方法的參數;當然也是np.random.random。)

+0

第二部分正是我所期待的。謝謝! –

+0

問題 - 第二部分實際上並沒有填寫df。 –

+0

@StevenNguyen是的,對不起'回合。我已經通過使用'.values'屬性來修正(欺騙):避免Pandas跟蹤索引,這些索引不正確匹配(樣本是從其行中沒有NaN的索引創建的,而他們需要被分配到其行中具有NaN的索引:這不正確地匹配)。 – Evert

相關問題