Как взять более сбалансированный образец данных Python

У меня есть датафрейм с процентной информацией. Например.

Количество слов в процентах

2,0 1282 0,267345

1,0 888 0,185213

3,0 1124 0,170791

4,0 1250 0,152877

5,0 554 0,084864

6,0 333 0,058904

7,0 160 0,024290

8,0 111 0,016851

Весь процент может быть суммой до 1. В кадре данных 6000 записей. Я хочу взять 2000 образцов из него. Образец 2000 года должен быть как можно более сбалансированным.

Он должен включать в себя максимальный объем данных в процентах и ​​минимальный объем данных в процентах.

Я не знаю, как это сделать.

Например. 2000 имеет все данные из WordCount 8.0 и минимальные данные из 2.0.

Когда я строю гамма-распределение, линия должна быть как можно более плоской.

1 ответ

Решение

Сначала вам нужно посчитать, сколько образцов нужно взять из каждого слова. Предполагая, что 'wc' является фреймом данных со столбцами 'wordCount' и 'number':

 options = len(wc)
 remaining = 2000
 wc['how many'] = 0
 wc = wc.sort_values('number').reset_index().drop('index', axis=1)
 for i in range(options):
     wc['how many'][i] = min(wc['number'][i], remaining // (options - i))
     remaining -= wc['how many'][i]

В столбцах "сколько" теперь есть число, которое вы хотите выбрать из каждого wordCount. Затем на вашем фрейме данных, скажем, с именем "data", у вас должен быть соответствующий столбец с именем "wordCount", и вы можете выбрать нужное число с помощью:

for i in data['wordCount'].unique():
    part_data = data[data['wordCount'] == i]
    part_sample = part_data.sample(wc[wc['wordCount'] == i].iloc[0, -1])
    try:
        all_samples = pd.concat([all_samples, part_sample])
    except NameError:
        all_samples = part_sample.copy()

В конце концов, 'all_samples' должен иметь 2000 сэмплов с запрошенным вами дистрибутивом.

Кстати, зацикливание строк данных вообще плохая идея, и ее можно было бы векторизовать, но, поскольку это всего 8 строк, я позволил себе.

Другие вопросы по тегам