Применить медиану из подмножества ко всему столбцу, Python / Pandas

#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 строках. Выглядит некрасиво, но работает. Впоследствии мне нужно вернуться к этой ошибке