Заполните Пропущенные Значения Категориального Столбца

#python #pandas

Вопрос:

Я пытаюсь заполнить некоторые отсутствующие категориальные значения столбца. У меня есть 2 колонки. Один категоричен, а другой-нет. Если в категориальном столбце отсутствует значение, я хочу присвоить ему значение на основе категориального значения, имеющего наибольшее количество отсчетов.

Мои колонки выглядят так:

 School_Assigned    Will_You_Enroll_There

Anderson           Yes
Williams           No
Anderson           NaN
Anderson           Yes
Anderson           Maybe
 

Исходя из этого, значение NaN должно содержать «Да», так как количество » Да «(для Андерсона) больше, чем количество » нет » и «возможно». School_Assigned и will_you_enroll_ Есть столбцы 10 и 11 соответственно. Мой фрейм данных называется gt_Exam.

Вот мой код:

 enroll_categories = ["Yes", "No", "Maybe"]
count1 = 0
count2 = 0
count3 = 0

for i in range(len(gt_Exam)):

    if pd.isna(gt_Exam.iloc[i, 11]) == True:

        value = gt_Exam.iloc[i, 10]

        for j in range(len(gt_Exam)):

            if (gt_Exam.iloc[j, 10] == value) amp; (gt_Exam.iloc[j, 11] == enroll_categories[0]):

                count1  = 1

            elif (gt_Exam.iloc[j, 10] == value) amp; (gt_Exam.iloc[j, 11] == enroll_categories[1]):

                count2  = 1

            elif (gt_Exam.iloc[j, 10] == value) amp; (gt_Exam.iloc[j, 11] == enroll_categories[2]):

                count3  = 1

        maximum_categories = max(count1, count2, count3)

        if maximum_categories == count1:

            gt_Exam.iloc[i, 11] = enroll_categories[0]

        elif maximum_categories == count2:

            gt_Exam.iloc[i, 11] = enroll_categories[1]

        else:

            gt_Exam.iloc[i, 11] = enroll_categories[2]   
 

Ответ №1:

Мы можем попробовать fillna с первым mode на группу ( groupby transform ):

 gt_Exam['Will_You_Enroll_There'] = gt_Exam['Will_You_Enroll_There'].fillna(
    gt_Exam.groupby('School_Assigned')['Will_You_Enroll_There']
        .transform(lambda s: pd.Series.mode(s)[0])
)
 

Series.get может использоваться, если возможно, что группа-это все NaN и, таким образом, не создает никакого режима. Это предотвратит ошибку ключа, а также (необязательно) позволит указать значение по умолчанию:

 gt_Exam['Will_You_Enroll_There'] = gt_Exam['Will_You_Enroll_There'].fillna(
    gt_Exam.groupby('School_Assigned')['Will_You_Enroll_There']
        .transform(lambda s: pd.Series.mode(s).get(0))
)
 

gt_Exam :

   School_Assigned Will_You_Enroll_There
0        Anderson                   Yes
1        Williams                    No
2        Anderson                   Yes
3        Anderson                   Yes
4        Anderson                 Maybe
 

Фрейм данных:

 import numpy as np
import pandas as pd

gt_Exam = pd.DataFrame({
    'School_Assigned': {0: 'Anderson', 1: 'Williams', 2: 'Anderson',
                        3: 'Anderson', 4: 'Anderson'},
    'Will_You_Enroll_There': {0: 'Yes', 1: 'No', 2: np.nan, 3: 'Yes',
                              4: 'Maybe'}
})
 

Комментарии:

1. По какой-то причине я получаю ошибку ключа: 0

2. Возможно ли, что у вас есть группы, которые все являются NaN?

3. Да, они там есть.

4. Вы можете попробовать get(0) вместо [0] того, чтобы смотреть на редактирование.

5. Идеально!! Все Прошло Гладко! Большое спасибо!!