2017-09-25 62 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

相关问题