每组随机抽取一个样本,以分层样本结束

2024-10-03 04:38:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用这样的数据帧:

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]

那么,有没有办法做一些类似的事情,但是分层的呢?谢谢


Tags: 数据lambdafalseobjindexnpgrouprandom
1条回答
网友
1楼 · 发布于 2024-10-03 04:38:29

您可以从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

Sample Data

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})

相关问题 更多 >