Python 按计数分层抽样
我想创建一个示例列,该列将按sId和cId均匀选择vcount: 现在我需要它为样本100工作,预期输出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 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