Вы можете использовать образец , из документации:
Вернуть случайную выборку предметов с оси объекта.
Трюкиспользовать образец в каждой группе, пример кода:
import pandas as pd
positions = {"least": 0.277220, "left": 0.250000, "right": 0.250000, "left-center": 0.141244, "right-center": 0.081536}
data = [['title-{}-{}'.format(i, position), position] for i in range(1000) for position in positions.keys()]
frame = pd.DataFrame(data=data, columns=['title', 'position'])
print(frame.shape)
def sample(obj, replace=False, total=1000):
return obj.sample(n=int(positions[obj.name] * total), replace=replace)
result = frame.groupby('position', as_index=False).apply(sample).reset_index(drop=True)
print(result.groupby('position').agg('count'))
Выход
(5000, 2)
title
position
least 277
left 250
left-center 141
right 250
right-center 81
В приведенном выше примере я создал фрейм данных с 5000 строк и 2столбцы, первая часть вывода.
Я предполагаю, что у вас есть словарь позиций (для преобразования DataFrame в словарь см. this ) с процентным значением для выборки из каждой группы и общим параметром (т. Е. Общим значением для выборки).).
Во второй части вывода вы видите, что у вас есть 277 наименьших строк из 100, 277 / 1000 = 0.277
.Это приближение к требуемому, то же самое относится и к остальным группам.Однако есть предостережение: количество отсчетов составляет 999 вместо запланированных 1000.