Произвольная выборка данных Pandas на основе распределения столбца - PullRequest
0 голосов
/ 25 сентября 2018

Скажем, у меня очень большой фрейм данных, который я хочу выбрать, чтобы максимально точно соответствовать распределению столбца фрейма данных (в данном случае, столбца смещения).

Я запускаю:

train['bias'].value_counts(normalize=True)

и см .:

least           0.277220
left            0.250000
right           0.250000
left-center     0.141244
right-center    0.081536

Если я хочу взять выборку из фрейма данных поезда, где распределение столбца смещения выборки соответствует этому распределению, что будетлучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Вот один вкладыш для выборки на основе распределения

positions = {"least": 0.277220, "left": 0.250000, "right": 0.250000, "left-center": 0.141244, "right-center": 0.081536}
total = len(df)

df = pd.concat([df[df['position'] == k].sample(int(v * total), replace=False) for k, v in fps_dict.items()])
0 голосов
/ 25 сентября 2018

Вы можете использовать образец , из документации:

Вернуть случайную выборку предметов с оси объекта.

Трюкиспользовать образец в каждой группе, пример кода:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...