2017-05-16 4 views
3

Ich muss nach dem Attribut 'ids' einen Datenrahmen nach dem Zufallsprinzip in zwei disjunkte Sätze trennen. Betrachten wir zum Beispiel die folgende Datenrahmen:zufällige Stichproben mit Pandas Datenrahmen disjoint Gruppen

df= 
Out[470]: 
      0  1  2  3  ids 
0  17.0 18.0 16.0 15.0  13.0 
1  18.0 16.0 15.0 15.0  13.0 
2  16.0 15.0 15.0 16.0  13.0 
131 12.0 8.0 21.0 19.0  14.0 
132  8.0 21.0 19.0 20.0  14.0 
133 21.0 19.0 20.0 9.0  14.0 
248  NaN NaN 12.0 11.0  17.0 
249  NaN 12.0 11.0 10.0  17.0 
250 12.0 11.0 10.0 NaN  17.0 
287  3.0 3.0 1.0 8.0  20.0 
288  3.0 1.0 8.0 3.0  20.0 
289  1.0 8.0 3.0 3.0  20.0 
413 21.0 7.0 16.0 18.0  25.0 
414  7.0 16.0 18.0 19.0  25.0 
415 16.0 18.0 19.0 18.0  25.0 
665 10.0 8.0 8.0 7.0  27.0 
666  8.0 8.0 7.0 9.0  27.0 
667  8.0 7.0 9.0 8.0  27.0 
790  NaN NaN 15.0 NaN  33.0 
791  NaN 15.0 NaN 10.0  33.0 
792 15.0 NaN 10.0 NaN  33.0 
812  NaN 16.0 NaN 17.0  34.0 
813 16.0 NaN 17.0 NaN  34.0 
814  NaN 17.0 NaN 13.0  34.0 
944  3.0 4.0 3.0 18.0  35.0 
945  4.0 3.0 18.0 18.0  35.0 
946  3.0 18.0 18.0 11.0  35.0 
1059 9.0 10.0 3.0 4.0  56.0 
1060 10.0 3.0 4.0 3.0  56.0 
1061 3.0 4.0 3.0 3.0  56.0 
    ... ... ... ...  ... 
10125 NaN 9.0 5.0 5.0 101317.0 
10126 9.0 5.0 5.0 5.0 101317.0 
10127 5.0 5.0 5.0 7.0 101317.0 

Ich brauche zwei zu erhalten (zufällig mit einigen Fraktionsgröße getrennt) Datenrahmen mit keine Werte ids schneidet.

Ich weiß, wie es zu lösen in ‚Nicht-pandasian‘ Art und Weise:

  • erhalten die einzigartigen Werte des ids
  • zufällig die eindeutigen Werte in zwei disjunkte Gruppen aufgeteilt
  • wählen Reihe nach Werte von ids in zwei .isin()

mit Gruppen ich frage mich, ob es eine einfache und saubere Art und Weise ist es mit etwas pa zu tun ndas eingebaute Funktion, wie .sample()?

Antwort

4

sklearn.model_selection.GroupShuffleSplit Mit dem Split auszuführen:

from sklearn.model_selection import GroupShuffleSplit 

# Initialize the GroupShuffleSplit. 
gss = GroupShuffleSplit(n_splits=1, test_size=0.5) 

# Get the indexers for the split. 
idx1, idx2 = next(gss.split(df, groups=df.ids)) 

# Get the split DataFrames. 
df1, df2 = df.iloc[idx1], df.iloc[idx2] 
+0

das ist in der Tat sehr schöne Methode - ich habe es noch nie zuvor verwendet. Danke für den Hinweis! – MaxU

2

UPDATE:

df1 = df.sample(frac=1).loc[df.ids % 2 == 0] 
df2 = df.loc[df.index.difference(df1.index)] 

OLD falsch (es ist nicht die Trennung IDs schert) Antwort:

können Sie zunächst mischen Ihre DF sample(frac=1) und anschließend np.split() verwenden :

df1, df2 = np.split(df.sample(frac=1), 2) 
+0

@MaxU, danke, aber es funktioniert nicht. Ich bekomme die gleichen 'IDs' in beiden Sets. –

+0

@ArnoldKlein, ich habe meine Antwort aktualisiert - bitte überprüfen ... – MaxU

+0

Großartig! Funktioniert als Charme! (Ich lerne Pandas, also werden solche ordentlichen Lösungen sehr geschätzt) –