[英]Get one random sample for each group and end with a stratified sample pandas
我正在使用这样的数据框:
group period
A 20130101
A 20130201
. .
E 20130901
E 20131001
假设我有 100 个不同的组和 10 个可能的日期,它们的分布如下: [.1,.05,.2,.05,.1,.1,.2,.05,.05,.1]
。 我需要为每组获取一个样本,因此最终样本的 10% 来自第一期,5% 来自第二期,20% 来自第三期,依此类推。 我设法为每个组获得了一个随机样本,但它严重倾斜,如下所示:
fn = lambda obj: obj.loc[np.random.choice(obj.index, 1, replace=False),:]
dfrd = df[['group','period']].groupby('group', as_index=False).apply(fn)
dfrd.index = [index[1] for index in dfrd.index]
那么,有没有办法做一些类似但分层的事情? 谢谢
您可以使用np.random.choice
p
参数:
df1 = (df
.groupby('grp')
.apply(lambda x: np.random.choice(x['period'].values, size=1, p=prob)[0])
.reset_index()
.rename(columns={0:'period'}))
grp period
0 A 2013-01-03
1 B 2013-01-04
2 C 2013-01-04
3 D 2013-01-03
样本数据
period = list(map(str, pd.date_range(start='20130101', freq='D', periods=10).date))
grp = sorted(['A','B','C','D']*10)
prob = [.1,.05,.2,.05,.1,.1,.2,.05,.05,.1]
df = pd.DataFrame({'grp': grp, 'period': period*4})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.