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