簡體   English   中英

為每組獲取一個隨機樣本,並以分層樣本熊貓結束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM