Заменить NaN случайным значением в каждой строке - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть набор данных со столбцом «Self_Employed». В этих столбцах указаны значения «Да», «Нет» и «NaN». Я хочу заменить значения NaN значением, которое рассчитывается в calc (). Я попробовал некоторые методы, которые я нашел здесь, но я не мог найти тот, который был бы применим ко мне. Вот мой код, я поместил то, что я пробовал, в комментариях.

    # Handling missing data - Self_employed
SEyes = (df['Self_Employed']=='Yes').sum()
SEno = (df['Self_Employed']=='No').sum()

def calc():
    rand_SE = randint(0,(SEno+SEyes))
    if rand_SE > 81:
        return 'No'
    else:
        return 'Yes'


> # df['Self_Employed'] = df['Self_Employed'].fillna(randint(0,100))
> #df['Self_Employed'].isnull().apply(lambda v: calc())
> 
> 
> # df[df['Self_Employed'].isnull()] = df[df['Self_Employed'].isnull()].apply(lambda v: calc())  
> # df[df['Self_Employed']]
> 
> # df_nan['Self_Employed'] = df_nan['Self_Employed'].isnull().apply(lambda v: calc())
> # df_nan
> 
> #  for i in range(df['Self_Employed'].isnull().sum()):
> #      print(df.Self_Employed[i]


df[df['Self_Employed'].isnull()] = df[df['Self_Employed'].isnull()].apply(lambda v: calc())
df

теперь строка, где я пробовал это с df_nan, кажется, работает, но тогда у меня есть отдельный набор только с предыдущими пропущенными значениями, но я хочу заполнить пропущенные значения во всем наборе данных. В последнем ряду я получаю сообщение об ошибке, я ссылаюсь на скриншот. Вы понимаете мою проблему и если да, можете ли вы помочь?

Это набор только с теми строками, где Self_Employed равен NaN

Это оригинальный набор данных

Это ошибка

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Убедитесь, что SEno + SEyes! = Null используйте метод .loc, чтобы установить значение для Self_Employed, когда оно пустое

SEyes = (df['Self_Employed']=='Yes').sum() + 1
SEno = (df['Self_Employed']=='No').sum()

def calc():
    rand_SE = np.random.randint(0,(SEno+SEyes))
    if(rand_SE >= 81):
        return 'No'
    else:
        return 'Yes'

df.loc[df['Self_Employed'].isna(), 'Self_Employed'] = df.loc[df['Self_Employed'].isna(), 'Self_Employed'].apply(lambda x: calc())
0 голосов
/ 08 ноября 2018

Сначала вы можете определить местоположение ваших NaN s, например

na_loc = df.index[df['Self_Employed'].isnull()]

Подсчитайте количество NaN с в вашем столбце, как

num_nas = len(na_loc)

Затем сгенерируйте соответствующее количество случайных чисел, легко индексируйте и настройте

fill_values = pd.DataFrame({'Self_Employed': [random.randint(0,100) for i in range(num_nas)]}, index = na_loc)

И, наконец, подставьте эти значения в ваш фрейм данных

df.loc[na_loc]['Self_Employed'] = fill_values
0 голосов
/ 08 ноября 2018

А как же df['Self_Employed'] = df['Self_Employed'].fillna(calc())?

...