Как наложить ограничения на сэмплирование в pandas sample?
Пусть есть какой то массив из 1000 элементов. Мне нужно с помощью метода pandas.sample сформировать новый массив на 1000 элементов, в который будут случайным образом попадать элементы из первого массива. Но при этом мне нужно наложить ограничения на использование первого массива, чтобы рандомайзер выбирал не из всех 1000 элементов, а, например, только из 0.95% из них. Т.е. до начала выборки он случайным образом отсечет 0.05% из доступных элементов, и только по оставшимся начнет семплирование. Создание массивов будет многократно повторятся на разных выборках, поэтому какой то единственный предварительный отсев в первом массиве делать нельзя, каждый раз рандомайзер должен производиться заново
Ответы (1 шт):
Как уже замечено в комментарии 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