В настоящее время у меня есть этот df (уникальные значения res ниже) строк и распределение 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 уникальных res, мне нужно будет создать 10 df в памяти, и это плохо масштабируется. Я думал, что np.random.choice() может помочь, но на данный момент не уверен.

0
Kenan 5 Окт 2018 в 23:19

1 ответ

Лучший ответ

Например, используя 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

В вашем примере может потребоваться цикл for 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})
1
BENY 5 Окт 2018 в 20:32