【发布时间】:2017-07-24 22:17:59
【问题描述】:
我基本上是在尝试进行这种蒙特卡罗类型的分析,我将实验中的参与者随机重新分配到新组,然后根据随机的新组重新分析数据。所以这就是我想要做的事情:
参与者最初被分成八组,每组四名参与者。我想将每个参与者随机重新分配到一个新组,但我不希望任何参与者最终进入一个新组与来自同一原始组的另一个参与者。
这是我在这方面的进展:
import random
import pandas as pd
import itertools as it
data = list(it.product(range(8),range(4)))
test_df = pd.DataFrame(data=data,columns=['group','partid'])
test_df['new_group'] = None
for idx, row in test_df.iterrows():
start_group = row['group']
takens = test_df.query('group == @start_group')['new_group'].values
fulls = test_df.groupby('new_group').count().query('partid >= 4').index.values
possibles = [x for x in test_df['group'].unique() if (x not in takens)
and (x not in fulls)]
test_df.loc[idx,'new_group'] = random.choice(possibles)
这里的基本思想是,我将参与者随机重新分配到一个新组,其约束条件是 (a) 新组没有他们原来的组合作伙伴之一,并且 (b) 新组没有有 4 个或更多参与者已重新分配给它。
这种方法的问题在于,很多时候,当我们尝试重新分配最后一个组时,唯一剩余的组槽位在同一个组中。我可以也只是尝试在失败时重新随机化直到成功,但这感觉很愚蠢。另外,我想进行 100 次随机重新分配,所以这种方法可能会变得很慢......
所以必须有一个更聪明的方法来做到这一点。我也觉得应该有一个更简单的方法来解决这个问题,考虑到目标感觉多么简单(但我意识到这可能会产生误导......)
【问题讨论】:
-
每个组的参加人数是否少于组的总数?否则这是不可能的。
-
不,八组四人。
标签: python pandas random data-science experimental-design