我有一个数据帧,我需要以非常特定的方式使用特定规则随机化,我有点迷茫。简化版本如下:
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
如果我们认为它包含七个"束",我想随机洗牌这些束,即保留时间列。但是,约束是洗牌后,特定的束类型(在本例中为a
或b
(不能连续出现超过 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 循环,以这种方式打乱它,循环遍历帧并跟踪连续type
s 的数量,如果它超过我的 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])