我目前有这个字符串的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)
可以提供帮助,但目前还不确定。
答案 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})