it-swarm.com.de

Geschichtetes Sampling in Pandas

Ich habe mir die Sklearn geschichteten Sampling-Dokumente sowie die pandas-Dokumente und auch Stratified-Samples von Pandas und sklearn-stratified-Samples basierend auf einer Spalte angesehen, aber sie tun dies nicht dieses Problem angehen.

Ich suche nach einer schnellen Pandas/sklearn/numpy-Methode, um geschichtete Samples der Größe n aus einem Datensatz zu erzeugen. Für Zeilen mit weniger als der angegebenen Stichprobenummer sollten jedoch alle Einträge verwendet werden.

Konkretes Beispiel:

enter image description here

Vielen Dank! :)

13
Wboy

Verwenden Sie min, wenn Sie die Nummer an das Sample übergeben. Betrachten Sie den Datenrahmen df

df = pd.DataFrame(dict(
        A=[1, 1, 1, 2, 2, 2, 2, 3, 4, 4],
        B=range(10)
    ))

df.groupby('A', group_keys=False).apply(lambda x: x.sample(min(len(x), 2)))

   A  B
1  1  1
2  1  2
3  2  3
6  2  6
7  3  7
9  4  9
8  4  8
36
piRSquared

Durch die Erweiterung der groupby-Antwort können wir sicherstellen, dass das Sample ausgewogen ist. Wenn für alle Klassen die Anzahl der Stichproben> = n_samples ist, können wir einfach n_samples für alle Klassen verwenden (vorherige Antwort). Wenn die Minoritätsklasse <n_samples enthält, können wir die Anzahl der Proben für alle Klassen als die der Minoritätsklasse annehmen.

def stratified_sample_df(df, col, n_samples):
    n = min(n_samples, df[col].value_counts().min())
    df_ = df.groupby(col).apply(lambda x: x.sample(n))
    df_.index = df_.index.droplevel(0)
    return df_
1
Ilya Prokin

das folgende Beispiel enthält insgesamt N Zeilen, in denen jede Gruppe in ihrem ursprünglichen Verhältnis zur nächsten Ganzzahl erscheint. Mischen Sie anschließend den Index.

df = pd.DataFrame(dict(
    A=[1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4],
    B=range(20)
))

Kurz und bündig:

df.sample(n=N, weights='A', random_state=1).reset_index(drop=True)

Lange Version

df.groupby('A', group_keys=False).apply(lambda x: x.sample(int(np.rint(N*len(x)/len(df))))).sample(frac=1).reset_index(drop=True)
0
irkinosor