使用pandas生成负采样数据怎么实现?
有如下两个数据:
df = pd.DataFrame({'name':['a','a','b','b','b','c'],'num':[1,3,1,3,8,4]})
name num
0 a 1
1 a 3
2 b 1
3 b 3
4 b 8
5 c 4
df2 = pd.DataFrame({'num':[1,2,3,4,5,6,7,8,9,10]})
num
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
要生成除name对应的num,比例为2。
比如 a有1,3 则从df2中取除1,3的剩下的八个中取两个样本乘以比例,即随机取四个,b有三个样本则取6个。
我生成的是一个一个的,而且用了for循环,感觉不可取,但没想到更好的方法,希望大神能指教一二,谢谢了。
df3 = df.groupby(by='name').count()
u = [i for i in df3.index]
s = [i for i in df3['num'] * 2]
for i,j in zip(s,u):
df4 = df2[~df2.num.isin(df[df.name == j].num)]
df6 = df4.sample(n=i, replace=False, random_state=1)
df6['name'] = j
num name
9 10 a
4 5 a
3 4 a
8 9 a
num name
9 10 b
5 6 b
4 5 b
3 4 b
7 8 b
6 7 b
num name
9 10 c
2 3 c
希望的效果:
num name
9 10 a
4 5 a
3 4 a
8 9 a
9 10 b
5 6 b
4 5 b
3 4 b
7 8 b
6 7 b
9 10 c
2 3 c
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
作为采样集你的 df2 应该是唯一的吧?
这里要先把 df2 中的 num 设为 index,再分组操作
先用 groupby 对 df 进行分组
代入一个匿名函数,里面的参数 x 就是分组之后的 num,a组 1 3,b组 1 3 8 ...
DataFrame 的 index 里的方法 difference 可以得到一个减集,这样就可以去除 num 了
接着就 sample 一下,采样数是分组后 num 的个数再乖以 2