使用非缺失数据填充pandas数据帧中两列的缺失数据

时间:2017-09-25 03:30:01

标签: python pandas dataframe series

我有一个包含3列的pandas数据帧。

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

对于大约1%的数据集,foo和bar都缺失,但不是id。我希望用随机的非空foobar对进行估算。假设id永远不为null,foo和bar都是null或者都是非null。

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

这可以帮到你吗?

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

答案 2 :(得分:0)

假设当'foo'值丢失时,'bar'值也会丢失(根据你的问题),并且列类型是浮点数:

<!DOCTYPE html>

<小时/> 如果您想使用实际数据框本身的有效值(因为它们更好地代表数据的值范围),您可以使用以下代码:

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