Python 按计数分层抽样

Python 按计数分层抽样,python,pandas,Python,Pandas,我想创建一个示例列,该列将按sId和cId均匀选择vcount: 现在我需要它为样本100工作,预期输出 sId cId vcount sample 0 s0 c0 322 50 1 s0 c1 168 50 2 s1 c2 1818 50 3 s1 c3 81 50 4 s2 c4 1

我想创建一个示例列,该列将按sId和cId均匀选择vcount:

现在我需要它为样本100工作,预期输出

      sId      cId  vcount  sample
0      s0       c0     322      50
1      s0       c1     168      50
2      s1       c2    1818      50
3      s1       c3      81      50
4      s2       c4   13114      90
5      s2       c5       5       5
6      s2       c6       3       3
7      s2       c7       2       2
8      s3       c8    1979      22
9      s3       c9    1561      22
10     s3      c10    1548      22
11     s3      c11    1009      23
12     s3      c12      11      11
如您所见,对于sId s2,有4个CID,因此我们希望每个CID中有25个;然而,一个1有超过25个,因此我们必须选择所有其他CID,并从c4中获取剩余的。同样,s0有2个cId,因此我们希望每个cId有50个,每个cId有50多个样本。对于s3,哪一个是最大的样本并不重要,我只需要分布尽可能均匀

目标是为每个sId选择所有cId,并尽可能均匀地划分100

我无法理解这一点,只能手动输入示例列;但是,当列表变大时,这不是一个合理的解决方案。

尝试以下方法:

从这个问题上抓取附近的东西。 Groupby sId和apply get_示例 使用vcount中的值为样本列加素数。 创建vcount掩码,其中小于组中的总样本/行数 从vcount获取一系列值,其中值小于最小采样值 将vcount比min sample大GTE的掩模反比样本分配给剩余样本的均匀分布。 作为pd进口熊猫 数据帧{'sId':{0:'s0',1:'s0',2:'s1',3:'s1',, 4:'s2',5:'s2',6:'s2',7:'s2', 8:'s3',9:'s3',10:'s3',11:'s3', 12:'s3'}, 'cId':{0:'c0',1:'c1',2:'c2',3:'c3', 4:'c4',5:'c5',6:'c6',7:'c7', 8:'c8',9:'c9',10:'c10',11:'c11', 12:'c12'}, ‘vcount’:{0:322,1:168,2:1818,3:81, 4: 13114, 5: 5, 6: 3, 7: 2, 8: 1979, 9: 1561, 10: 1548, 11: 1009, 12: 11}} 控制变量 样本总数=100 def近_splitx,数量_箱: 如果num_bins请尝试以下方法:

从这个问题上抓取附近的东西。 Groupby sId和apply get_示例 使用vcount中的值为样本列加素数。 创建vcount掩码,其中小于组中的总样本/行数 从vcount获取一系列值,其中值小于最小采样值 将vcount比min sample大GTE的掩模反比样本分配给剩余样本的均匀分布。 作为pd进口熊猫 数据帧{'sId':{0:'s0',1:'s0',2:'s1',3:'s1',, 4:'s2',5:'s2',6:'s2',7:'s2', 8:'s3',9:'s3',10:'s3',11:'s3', 12:'s3'}, 'cId':{0:'c0',1:'c1',2:'c2',3:'c3', 4:'c4',5:'c5',6:'c6',7:'c7', 8:'c8',9:'c9',10:'c10',11:'c11', 12:'c12'}, ‘vcount’:{0:322,1:168,2:1818,3:81, 4: 13114, 5: 5, 6: 3, 7: 2, 8: 1979, 9: 1561, 10: 1548, 11: 1009, 12: 11}} 控制变量 样本总数=100 def近_splitx,数量_箱:
如果数量大于100,您能否澄清为什么s1为50/50,而它只有一个大于100?s1有两个cId,两个都大于50,因此我们可以从每个cId中抽取50个样本。然而,这种逻辑不适用于s2/s3。我更新了注释,以澄清为什么s1为50/50,而只有一个大于100?s1有两个cId,两个都大于50,因此我们可以从每个cId中抽取50个样本。然而,这种逻辑不适用于s2/s3。我将笔记更新为clarifynice work+1。定义min\u sample=total\u sample/get\u sample中的行怎么样?哇,太棒了@你能告诉我你的代码是如何工作的吗?我已经更新了我的答案,加入了@tdy的建议。在您更新的解释Nice work+1之前,我最初将过滤硬编码为50个样本。定义min\u sample=total\u sample/get\u sample中的行怎么样?哇,太棒了@你能告诉我你的代码是如何工作的吗?我已经更新了我的答案,加入了@tdy的建议。在您更新解释之前,我最初将过滤硬编码为50个样本
      sId      cId  vcount  sample
0      s0       c0     322      50
1      s0       c1     168      50
2      s1       c2    1818      50
3      s1       c3      81      50
4      s2       c4   13114      90
5      s2       c5       5       5
6      s2       c6       3       3
7      s2       c7       2       2
8      s3       c8    1979      22
9      s3       c9    1561      22
10     s3      c10    1548      22
11     s3      c11    1009      23
12     s3      c12      11      11
   sId  cId  vcount  sample
0   s0   c0     322      50
1   s0   c1     168      50
2   s1   c2    1818      50
3   s1   c3      81      50
4   s2   c4   13114      90
5   s2   c5       5       5
6   s2   c6       3       3
7   s2   c7       2       2
8   s3   c8    1979      23
9   s3   c9    1561      22
10  s3  c10    1548      22
11  s3  c11    1009      22
12  s3  c12      11      11