Как наложить ограничения на сэмплирование в pandas sample?

Рейтинг: -1Ответов: 1Опубликовано: 15.03.2023

Пусть есть какой то массив из 1000 элементов. Мне нужно с помощью метода pandas.sample сформировать новый массив на 1000 элементов, в который будут случайным образом попадать элементы из первого массива. Но при этом мне нужно наложить ограничения на использование первого массива, чтобы рандомайзер выбирал не из всех 1000 элементов, а, например, только из 0.95% из них. Т.е. до начала выборки он случайным образом отсечет 0.05% из доступных элементов, и только по оставшимся начнет семплирование. Создание массивов будет многократно повторятся на разных выборках, поэтому какой то единственный предварительный отсев в первом массиве делать нельзя, каждый раз рандомайзер должен производиться заново

Ответы

▲ 2

Как уже замечено в комментарии strawdog - решении в двойном семплировании. Только при втором добавляем replace=True. Пример:

import pandas as pd
from pprint import pprint

df = pd.DataFrame({'num_legs': [2, 4, 8, 0, 2, 4, 8, 0, 2, 4, 8, 0],
                   'num_wings': [2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0],
                   'num_specimen_seen': [10, 2, 1, 8, 0, 2, 1, 8, 0, 2, 1, 8],
                  'name': ['falcon', 'dog', 'spider', 'fish', 'falcon1', 'dog1', 'spider1', 'fish1',
                         'falcon2', 'dog2', 'spider2', 'fish2']},
                  index=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])


df1 = df.sample(frac=0.95, ignore_index=True)
df2 = df1.sample(frac=1/0.95, replace=True, ignore_index=True)
pprint(df1)
pprint(df2)

------------------------------------

    num_legs  num_wings  num_specimen_seen     name
0          0          0                  8    fish1
1          0          0                  8    fish2
2          8          0                  1   spider
3          8          0                  1  spider2
4          8          0                  1  spider1
5          2          2                  0  falcon2
6          4          0                  2     dog2
7          4          0                  2      dog
8          4          0                  2     dog1
9          0          0                  8     fish
10         2          2                  0  falcon1
    num_legs  num_wings  num_specimen_seen     name
0          8          0                  1   spider
1          0          0                  8    fish2
2          4          0                  2      dog
3          2          2                  0  falcon2
4          8          0                  1   spider
5          8          0                  1  spider2
6          2          2                  0  falcon1
7          4          0                  2     dog1
8          4          0                  2      dog
9          2          2                  0  falcon2
10         0          0                  8     fish
11         2          2                  0  falcon1