campione casuale per gruppo, con min_rows

Sep 09 2020

Ho un dataframe e voglio provarlo. Tuttavia, durante il campionamento casuale, voglio avere almeno 1 campione da ogni elemento nella colonna. Voglio anche che anche la distribuzione abbia un effetto. (Es: i valori con più campioni sull'originale hanno di più sul df campionato)

Simile a questa e questa domanda, ma con una dimensione minima del campione per gruppo.

Diciamo che questo è il mio df:

df = pd.DataFrame(columns=['class'])
df['class'] = [0,0,0,0,0,0,0,0,0,0,0,0,0,1,2]
df_sample = df.sample(n=4)

E quando provo questo, voglio che df_sample abbia il seguente aspetto:

     Class
      0
      0
      1
      2

Grazie.

Risposte

Mathieu Sep 09 2020 at 22:11

Come suggerito da @YukiShioriii potresti:

1 - campiona una riga di ogni gruppo di valori

2 - campiona in modo casuale le righe rimanenti indipendentemente dai valori

RichieV Sep 09 2020 at 22:24

Seguendo il suggerimento di YukiShioriii e mprouveur

# random_state for reproducibility, remove in production code
sample = df.groupby('class').sample(1, random_state=1)

sample = sample.append(
    df[~df.index.isin(sample.index)] # only rows that have not been selected
    .sample(n=sample_size-sample.shape[0]) # sample more rows as needed
).sort_index()

Produzione

    class
2       0
4       0
13      1
14      2