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

使用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


回答:

作为采样集你的 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

以上是 使用pandas生成负采样数据怎么实现? 的全部内容, 来源链接: utcz.com/a/157443.html

回到顶部