выборка панд из серии на основе распределения - PullRequest
0 голосов
/ 05 октября 2018

В настоящее время у меня есть этот df (ниже приведены уникальные значения) строк и распределения p =[0.5, 0.33, 0.12, 0.05]

vid    res
v1    '1072X1920'
v2    '240X416'
v3    '360X640'
v4    '720X1280'

В серии более 5000 строк, и мне нужно выбрать 3000 видео с указанным выше распределением.Я знаю, что могу сделать это, разделив df на 4 части, по одной на каждое разрешение, и использую df.sample [: p [i] * 3000], например

df1072 = df[df['res'] == '1072X1920']
df1072 = df1072.sample(0.5 * 3000)

, но есть ли лучший способсделай это?Если бы у меня было 10 уникальных рез, то мне нужно было бы создать 10 df в памяти, и это не очень хорошо масштабируется.Я думал, что np.random.choice() может помочь, но не уверен в данный момент.

1 Ответ

0 голосов
/ 05 октября 2018

Например, используя sample в случайном порядке ваш df, затем используя np.split

df=pd.DataFrame({'A':np.arange(100)})
n=len(df)
df=df.sample(n)
l=np.split(df, [int(0.5*n), int(0.83*n),int(0.95*n)])

Тест:

list(map(len,l))
Out[1134]: [50, 33, 12, 5]

pd.concat(l).duplicated().any()
Out[1135]: False

Для вашего примера может потребоваться groupby дляпетля

d={}
for y, x in df.groupby('res'): 

    n=len(x)
    x=x.sample(n)
    l=np.split(x, [int(0.5*n), int(0.83*n),int(0.95*n)])
    d.append({y:l})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...