使用pandas生成负采样数据怎么实现?

发布于 2022-09-12 02:11:55 字数 1121 浏览 22 评论 0

有如下两个数据:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小忆控 2022-09-19 02:11:55

作为采样集你的 df2 应该是唯一的吧?
这里要先把 df2 中的 num 设为 index,再分组操作

df2 = df2.set_index('num', drop=False)

df.groupby('name')['num']\
.apply(lambda x: df2.loc[df2.index.difference(x)].sample(len(x) * 2, replace=True)).droplevel(1)

先用 groupby 对 df 进行分组
代入一个匿名函数,里面的参数 x 就是分组之后的 num,a组 1 3,b组 1 3 8 ...
DataFrame 的 index 里的方法 difference 可以得到一个减集,这样就可以去除 num 了
接着就 sample 一下,采样数是分组后 num 的个数再乖以 2

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文