熊猫随机洗牌数据帧与约束



我有一个数据帧,我需要以非常特定的方式使用特定规则随机化,我有点迷茫。简化版本如下:

idx type    time
1   a   1
2   a   1
3   a   1
4   b   2
5   b   2
6   b   2
7   a   3
8   a   3
9   a   3
10  b   4
11  b   4
12  b   4
13  a   5
14  a   5
15  a   5
16  b   6
17  b   6
18  b   6
19  a   7
20  a   7
21  a   7

如果我们认为它包含七个"束",我想随机洗牌这些束,即保留时间列。但是,约束是洗牌后,特定的束类型(在本例中为ab(不能连续出现超过 n 次(例如 2 次(。因此,示例正确结果如下所示:

idx type    time
21  a   7
20  a   7
19  a   7
7   a   3
8   a   3
9   a   3
17  b   6
16  b   6
18  b   6
6   b   2
5   b   2
4   b   2
2   a   1
3   a   1
1   a   1
14  a   5
13  a   5
15  a   5
12  b   4
11  b   4
10  b   4

我想我可以创建一个从 1 到 7 的单独"顺序"数组并对其进行np.random.shuffle(),然后按该顺序按time对数据帧进行排序,这可能会起作用 - 我可以想到完成这部分的方法,但我特别在限制重复次数的规则上挣扎。

我大致知道我应该使用 while 循环,以这种方式打乱它,循环遍历帧并跟踪连续types 的数量,如果它超过我的 n,则再次中断并启动 while 循环,直到它完成而不中断,在这种情况下设置一个值来结束 while 循环。但这变得如此混乱,没有奏效。

有什么想法吗?

看看这是否有效。

import pandas as pd 
import numpy as np

n = [['a',1],['a',1],['a',1],
['b',2],['b',2],['b',2],
['a',3],['a',3],['a',3]]
df = pd.DataFrame(n)
df.columns = ['type','time']
print(df)
order = np.unique(np.array(df['time']))
print("Before Shuffling",order)
np.random.shuffle(order)
print("Shuffled",order)
n =2
for i in order:
print(df[df['time']==i].iloc[0:n])

最新更新