python熊猫:根据百分比随机分配控制组和治疗组

python熊猫:根据百分比随机分配控制组和治疗组,python,pandas,dataframe,pandas-groupby,experimental-design,Python,Pandas,Dataframe,Pandas Groupby,Experimental Design,我正在进行一项实验设计,我需要将数据帧df按预先存在的分组按%分成一个控制组和一个治疗组 这是数据帧df: df.head() customer_id | Group | many other columns ABC 1 CDE 1 BHF 2 NID 1 WKL 2 SDI 2 pd.pivot_table(df,index=['Group'],v

我正在进行一项实验设计,我需要将数据帧df按预先存在的分组按%分成一个控制组和一个治疗组

这是数据帧df:

df.head()

customer_id | Group | many other columns
ABC             1
CDE             1
BHF             2
NID             1
WKL             2
SDI             2

pd.pivot_table(df,index=['Group'],values=["customer_id"],aggfunc=lambda x: len(x.unique()))

Group 1  : 55394
Group 2  : 34889
现在我需要在df中添加一个标记为“Flag”的列。 对于第一组,我想随机分配50%的“对照组”和50%的“测试组”。 对于第2组,我想随机分配40%的“对照组”和60%的“测试组”

我正在寻找的输出:

customer_id | Group | many other columns | Flag
ABC             1                          Test
CDE             1                          Control
BHF             2                          Test
NID             1                          Test
WKL             2                          Control
SDI             2                          Test
我们可以使用以下方法:

更新:

In [8]: df
Out[8]:
  customer_id  Group
0         ABC      1
1         CDE      1
2         BHF      2
3         NID      1
4         WKL      2
5         SDI      2
6         XXX      3
7         XYZ      3
8         XXX      3

In [9]: d = {1:[.5,.5], 2:[.4,.6], 3:[.2,.8]}

In [10]: df['Flag'] = \
    ...: df.groupby('Group')['customer_id'] \
    ...:   .transform(lambda x: np.random.choice(['Control','Test'], len(x), p=d[x.name]))
    ...:

In [11]: df
Out[11]:
  customer_id  Group     Flag
0         ABC      1     Test
1         CDE      1     Test
2         BHF      2  Control
3         NID      1  Control
4         WKL      2  Control
5         SDI      2     Test
6         XXX      3     Test
7         XYZ      3     Test
8         XXX      3     Test
我们可以使用以下方法:

更新:

In [8]: df
Out[8]:
  customer_id  Group
0         ABC      1
1         CDE      1
2         BHF      2
3         NID      1
4         WKL      2
5         SDI      2
6         XXX      3
7         XYZ      3
8         XXX      3

In [9]: d = {1:[.5,.5], 2:[.4,.6], 3:[.2,.8]}

In [10]: df['Flag'] = \
    ...: df.groupby('Group')['customer_id'] \
    ...:   .transform(lambda x: np.random.choice(['Control','Test'], len(x), p=d[x.name]))
    ...:

In [11]: df
Out[11]:
  customer_id  Group     Flag
0         ABC      1     Test
1         CDE      1     Test
2         BHF      2  Control
3         NID      1  Control
4         WKL      2  Control
5         SDI      2     Test
6         XXX      3     Test
7         XYZ      3     Test
8         XXX      3     Test

美丽不能同意more@Bharathshetty,谢谢!:)感谢您的评论@MaxU,非常感谢你-我现在正在测试它-如果我有3个组而不是2个,就像我在下一个项目中已经看到的那样;由于if/else语句只允许两个组,我将如何调整它?如果你喜欢我问一个新问题,请让我知道它起作用了,谢谢-我发布了一个关于3组的新问题,仅供参考,我不能同意more@Bharathshetty,谢谢!:)感谢您的评论@MaxU,非常感谢你-我现在正在测试它-如果我有3个组而不是2个,就像我在下一个项目中已经看到的那样;由于if/else语句只允许两个组,我将如何调整它?如果你喜欢我问一个新问题,请让我知道它是有效的,谢谢-我发布了一个关于3组的新问题供参考