基于分布的大熊猫采样

时间:2018-10-05 20:19:17

标签: python-3.x pandas numpy

我目前有这个字符串的df(以下为唯一值)和分布n=5 bin_vect = np.random.choice([0,1],n) >>> bin_vect array([1, 0, 0, 1, 1]) mat = np.random.random(size=(10,n)) >>> mat array([[0.15735662, 0.65755895, 0.30765648, 0.31206966, 0.26966997], [0.6809805 , 0.25911918, 0.97581884, 0.04420062, 0.08590758], [0.89132816, 0.81135223, 0.70684902, 0.72172889, 0.13525593], [0.23461475, 0.40596346, 0.53653079, 0.29897461, 0.07874171], [0.3729509 , 0.3591687 , 0.26103426, 0.60064124, 0.94791038], [0.7525988 , 0.16741262, 0.63850992, 0.43386548, 0.62131853], [0.50257526, 0.32734492, 0.15407767, 0.24540467, 0.18555366], [0.37653621, 0.09854166, 0.84080664, 0.67745231, 0.57761115], [0.92529631, 0.61171514, 0.8233337 , 0.33633327, 0.79718777], [0.39061711, 0.01156666, 0.73085425, 0.77808632, 0.86046158]]) >>> mat[:,bin_vect.astype('bool')] array([[0.15735662, 0.31206966, 0.26966997], [0.6809805 , 0.04420062, 0.08590758], [0.89132816, 0.72172889, 0.13525593], [0.23461475, 0.29897461, 0.07874171], [0.3729509 , 0.60064124, 0.94791038], [0.7525988 , 0.43386548, 0.62131853], [0.50257526, 0.24540467, 0.18555366], [0.37653621, 0.67745231, 0.57761115], [0.92529631, 0.33633327, 0.79718777], [0.39061711, 0.77808632, 0.86046158]])

p =[0.5, 0.33, 0.12, 0.05]

该系列大约有5000多行,我需要对上述分布的3000个视频进行采样。我知道我可以通过将df分成4部分来完成此操作,每个部分一个,然后使用df.sample [:p [i] * 3000],例如

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

但是有更好的方法吗?如果我有10个唯一的分辨率,那么我需要在内存中创建10 df,并且扩展性不好。我本以为df1072 = df[df['res'] == '1072X1920'] df1072 = df1072.sample(0.5 * 3000) 可以提供帮助,但目前还不确定。

1 个答案:

答案 0 :(得分: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

对于您的示例,可能需要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})