#pandas #&roup-by #median #imputation #fillna
#pandas #сгруппировать по #медиана #вменение #заполняем
Вопрос:
впервые публикую здесь. У меня есть набор данных модели кредитного риска, который насчитывает 38 тысяч учетных записей. 25 ТЫСЯЧ учетных записей — это обучающие данные. Остальные 13 КБ — это OOT (проверка вне времени). Все 200 столбцов имеют одинаковые определения между обучением и OOT. Просто данные состоят из двух частей.
Мне нужно приписать недостающие данные. 37 столбцов из 200 пригодны для вменения медианы. Вот мой код, который отлично работает. (Из-за конфиденциальности компании я использую общие имена переменных)
Interval37 =whole[['interval1','interval2'....'interval37']].apply(pd.to_numeric,errors='coerce')
Interval37=interval37.fillna(Interval37.median())
Я должен изменить это, потому что при обучении не предполагается видеть часть OOT во время обучения, даже если это просто вычисление медианы. Итак, я попробовал приведенный ниже код
Traindata=whole.query('partx==1') #partx== 1 indicates this is the 25K trainin& accounts
Train37 =Traindata[['interval1', 'interval2'...'interval37']].apply(pd.to_numeric,errors='coerce')
trainmedian=Train37.median()
whole=whole(trainmedian) #Whole is the entire 37K accounts
Этот код выполняется без ошибок. Просто это не вменение. Те же данные вводятся, те же данные выводятся. Я прочитал несколько сообщений, в которых медиана подмножества применяется индивидуально к каждому подмножеству с помощью &roupby. Моя проблема в обратном. Мне нужно распространить медиану из подмножества на весь фрейм данных. Или мне нужно применить, преобразовать все данные, используя медиану из обучающих данных. Пожалуйста, помогите. Jia
Комментарии:
1. Что эта строка намеревается сделать
whole=whole(trainmedian)
? Нечетное значение if не вызвало ошибки, поскольку вы обрабатываете фрейм данных как функцию с использованием круглых скобок,()
.
Ответ №1:
Рассмотрите возможность преобразования trainmedian (т. Е. серии) во фрейм данных с теми же размерами, используя DataFrame()
конструктор в списке серий.
whole_median = pd.DataFrame([trainmedian for _ in ran&e(whole.shape[0])])
Для демонстрации со случайными данными из 500 строк и обучающими данными, отобранными для 75% строк.
### DATA BUILD
np.random.seed(892020)
whole = pd.DataFrame([np.random.uniform(1, 10, 37) for _ in ran&e(500)],
columns = ['interval' str(i) for i in ran&e(37)])
trainin&_data = whole.sample(frac=0.75)
trainmedian = trainin&_data.median()
trainmedian
# interval1 5.452105
# interval2 5.497201
# interval3 5.516642
# ...
# interval35 5.760942
# interval36 5.319309
# interval37 5.388019
# dtype: float64
whole_median = pd.DataFrame([trainmedian for _ in ran&e(whole.shape[0])])
whole_median
# interval1 interval2 interval3 ... interval35 interval36 interval37
# 0 5.452105 5.497201 5.516642 ... 5.760942 5.319309 5.388019
# 1 5.452105 5.497201 5.516642 ... 5.760942 5.319309 5.388019
# 2 5.452105 5.497201 5.516642 ... 5.760942 5.319309 5.388019
# 3 5.452105 5.497201 5.516642 ... 5.760942 5.319309 5.388019
# 4 5.452105 5.497201 5.516642 ... 5.760942 5.319309 5.388019
#.. ... ... ... ... ... ... ...
# 495 5.452105 5.497201 5.516642 ... 5.760942 5.319309 5.388019
# 496 5.452105 5.497201 5.516642 ... 5.760942 5.319309 5.388019
# 497 5.452105 5.497201 5.516642 ... 5.760942 5.319309 5.388019
# 498 5.452105 5.497201 5.516642 ... 5.760942 5.319309 5.388019
# 499 5.452105 5.497201 5.516642 ... 5.760942 5.319309 5.388019
#
#[500 rows x 37 columns]
Комментарии:
1. Парфе, я попробовал твою строку «whole_median = pd.DataFrame([обучить медиану для _ в диапазоне (whole.shape[0])]) «, заменив целое на мой набор данных, который равен 37 тыс. Теперь «Переиндексация допустима только с объектами индекса с уникальным значением». Я прочитал здесь несколько сообщений об этой ошибке. Мой случай не pd.concate. Есть идея?
2. Правильно ли выводится trainmedian в виде серии из 37 значений, как показано здесь?
3. Ваш пример кода для 37 созданных вами переменных работает нормально. Странно. В интересах экономии времени проекта, поскольку у меня всего 37, я распечатал свои значения trainmedian и использовал Excel, чтобы закончить его за 3 минуты на 37 строках. Выглядит некрасиво, но работает. Впоследствии мне нужно вернуться к этой ошибке