2017-08-23 10 views
1

Ich bin auf der Suche nach einer eleganten Möglichkeit, einen Datensatz auf eine bestimmte Weise zu testen. Ich habe ein paar Lösungen gefunden, aber ich habe mich gefragt, ob einer von euch einen besseren Weg kennt. HierPython Pandas Dataframe Sampling

ist die Aufgabe, die ich bei stehe auf:

Ich möchte meine Daten-Set balancieren, so dass ich die gleiche Menge an Instanzen für die Klasse haben 0 wie für Klasse 1, so im Beispiel unten wir 5 Instanzen 0 von Klasse 1 und 11 Instanzen der Klasse:

 
id | class 
------ | ------ 
1 | 1 
1 | 0 
1 | 0 
1 | 0 
1 | 0 
2 | 1 
2 | 1 
2 | 0 
2 | 0 
2 | 0 
3 | 1 
3 | 1 
3 | 0 
3 | 0 
3 | 0 
3 | 0 

Sofar ich habe gerade zufällig 6 Instanzen der Klasse 0, gelöscht, aber ich möchte verhindern, dass alle Instanzen einer ID gelöscht werden konnte. Ich habe versucht, eine geschichtete "Split" mit sklearn, aber es funktioniert nicht, weil nicht jede ID mehr als 1 Element enthält. Die gewünschte Ausgabe sollte so ähnlich aussehen:

 
id | class 
------ | ------ 
1 | 1 
1 | 0 
2 | 1 
2 | 1 
2 | 0 
2 | 0 
3 | 1 
3 | 1 
3 | 0 
3 | 0 

Irgendwelche guten Ideen?

Antwort

0

Meine beste Vermutung: 'eine zufällige Zeile von jeder ID' schützen (separaten Datenrahmen mit diesen Zeilen erstellen), dann aus dem ursprünglichen Datenrahmen löschen, bis zufrieden (einschließlich der Tatsache, dass die Klassen im 'geschützten' Datenbereich bündig ausrichten mit was bleibt) und verketten die beiden Datenrahmen?

+0

Ja, ich dachte ich auch darüber nach, aber ich hoffte, dass es eine elegante Methode gibt, die Pandas-Probenmethode mit einigen ausgefallenen Gewichten zu verwenden, um die Klassen und dann die IDs auszugleichen. – SirTobi

0

kommen diese meiner Meinung nach:

  1. Nehmen class = 0 Teil des Datensatzes
  2. Nehmen class = 1 Teil-Datensatz
  3. Probe von Class0 Dataset gleiche Menge an Zeilen wie in class1 Dataset
  4. Concatenate

    df0 = df [df [ 'class'] == 0]

    df1 = df [df [ 'class'] == 1]

    df_strat pd.concat = ([df0.sample (df1.shape [0]), df1])