通过从pandas数据帧中的非缺失值中随机选择来填充缺失数据

时间:2016-04-04 21:34:53

标签: python pandas missing-data

我有一个pandas数据框,其中有几个缺失值。我注意到非缺失值彼此接近。因此,我想通过随机选择非缺失值来估算缺失值。

例如:

import pandas as pd
import random
import numpy as np

foo = pd.DataFrame({'A': [2, 3, np.nan, 5, np.nan], 'B':[np.nan, 4, 2, np.nan, 5]})
foo
    A   B
0   2 NaN
1   3   4
2 NaN   2   
3   5 NaN
4 NaN   5

我希望例如foo['A'][2]=2foo['A'][5]=3 我的pandas DataFrame的形状是(6940,154)。 我试试这个

foo['A'] = foo['A'].fillna(random.choice(foo['A'].values.tolist()))

但它不起作用。你能帮我实现吗?最好的问候。

6 个答案:

答案 0 :(得分:3)

您可以使用pandas.fillna方法和random.choice方法通过随机选择特定列来填充缺失值。

import random
import numpy as np

df["column"].fillna(lambda x: random.choice(df[df[column] != np.nan]["column"]), inplace =True)

其中column是要随机填充非nan值的列。

答案 1 :(得分:3)

这是对第一个答案进行改进之后的另一种方法,并根据如何在numpy文档中检查numpy int是否为n here

foo['A'].apply(lambda x: np.random.choice([x for x in range(min(foo['A']),max(foo['A'])]) if (np.isnan(x)) else x)

答案 2 :(得分:2)

我这样做是为了用随机的非 NaN 值填充 NaN 值:

import random

df['column'].fillna(random.choice(df['column'][df['column'].notna()]), inplace=True)

答案 3 :(得分:1)

这适用于Pandas DataFrame

def randomiseMissingData(df2):
    "randomise missing data for DataFrame (within a column)"
    df = df2.copy()
    for col in df.columns:
        data = df[col]
        mask = data.isnull()
        samples = random.choices( data[~mask].values , k = mask.sum() )
        data[mask] = samples

return df

答案 4 :(得分:1)

这是另一个Pandas DataFrame方法

import numpy as np
def fill_with_random(df2, column):
    '''Fill `df2`'s column with name `column` with random data based on non-NaN data from `column`'''
    df = df2.copy()
    df[column] = df[column].apply(lambda x: np.random.choice(df[column].dropna().values) if np.isnan(x) else x)
    return df

答案 5 :(得分:0)

对我来说只有这个有效,上面的所有例子都失败了。 有些填了相同的数字,有些什么都不填。

def fill_sample(df, col):
    tmp = df[df[col].notna()[col].sample(len(df[df[col].isna()])).values
    k = 0
    for i,row in df[df[col].isna()].iterrows():

       df.at[i, col] = tmp[k]
       k+=1
    return df