#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. Идеально!! Все Прошло Гладко! Большое спасибо!!