按特定列值随机排列数据框中的行

Shuffle rows in dataframe by specific colum value

我有一个数据框如下:

  Video Frames      Feature1    Feature2  Label
0   0   frame0.jpg  feature1    feature2    0
1   0   frame1.jpg  feature1    feature2    0
2   0   frame2.jpg  feature1    feature2    0
3   0   frame3.jpg  feature1    feature2    0
4   1   frame0.jpg  feature1    feature2    1
5   1   frame1.jpg  feature1    feature2    1
6   1   frame2.jpg  feature1    feature2    1
7   1   frame3.jpg  feature1    feature2    1
8   2   frame0.jpg  feature1    feature2    0
9   2   frame1.jpg  feature1    feature2    0
10  2   frame2.jpg  feature1    feature2    0
11  2   frame3.jpg  feature1    feature2    0

我想创建帧槽(例如 2 个连续帧)并打乱行,但始终确保保留属于同一视频的两个连续帧行。对于上述情况和 2 个连续帧的时隙,结果将是:

  Video Frames      Feature1    Feature2    Label
0   0   frame0.jpg  feature1    feature2    0
1   0   frame1.jpg  feature1    feature2    0
2   1   frame2.jpg  feature1    feature2    1
3   1   frame3.jpg  feature1    feature2    1
4   2   frame2.jpg  feature1    feature2    0
5   2   frame3.jpg  feature1    feature2    0
6   2   frame0.jpg  feature1    feature2    0
7   2   frame1.jpg  feature1    feature2    0
8   0   frame2.jpg  feature1    feature2    0
9   0   frame3.jpg  feature1    feature2    0
10  1   frame0.jpg  feature1    feature2    1
11  1   frame1.jpg  feature1    feature2    1

我希望插槽中的帧数是可配置的,我的意思是,对于上述情况,我 selected 2 但可能是 3 或 10 个连续帧。帧 selected 的 window 没有滑动,我的意思是,我 select [frame0, frame1] 并且在下一步中 [frame2, frame3] 但从来没有 [frame1,frame2] .

我一直在考虑最好的方法,但不清楚如何做。

提前致谢

IIUC,你可以 select 偶数索引洗牌,并使用 numpy 添加奇数索引:

import numpy as np

order = np.arange(0,len(df), 2)
np.random.shuffle(order)
order = np.vstack([order, order+1]).ravel('F')

df2 = df.iloc[order]

示例输出:

    Video      Frames  Feature1  Feature2  Label
2       0  frame2.jpg  feature1  feature2      0
3       0  frame3.jpg  feature1  feature2      0
0       0  frame0.jpg  feature1  feature2      0
1       0  frame1.jpg  feature1  feature2      0
6       1  frame2.jpg  feature1  feature2      1
7       1  frame3.jpg  feature1  feature2      1
8       2  frame0.jpg  feature1  feature2      0
9       2  frame1.jpg  feature1  feature2      0
10      2  frame2.jpg  feature1  feature2      0
11      2  frame3.jpg  feature1  feature2      0
4       1  frame0.jpg  feature1  feature2      1
5       1  frame1.jpg  feature1  feature2      1