2016-04-05 15 views
0

Ich versuche ein Trainings- und Testset aus einem Pandas-Datenrahmen zu erstellen. Wenn ich laufen:Sklearn StratifiedShuffleSplit mit Pandas

sss = StratifiedShuffleSplit(df['event'], n_iter=3, test_size=0.2) 

bekomme ich den Fehler:

ValueError: The least populated class in y has only 1 member, which is too few. The minimum number of labels for any class cannot be less than 2.

Dies ist jedoch nicht der Fall, weil, wenn ich laufen:

df.event.value_counts() 

ich:

irrelevant 5030 
event   394 

Irgendeine Idee, was könnte dieses Problem verursachen?

+0

Die Warnung kann nicht reproduziert werden. Aus Neugier, was ist 'len (df)'? –

+0

5424. Ich habe gerade mit einem völlig anderen csv versucht und es funktioniert gut, ich bin nicht sicher, was es ist über dieses df, das das Problem verursacht. – GNMO11

+0

Sieht aus wie eine leere Zeile in der CSV-Datei – GNMO11

Antwort

1

Wie Sie in einem Kommentar zu Ihrer Frage erwähnt haben, war es die leere Zeile/Zeile, die den Fehler verursacht hat.

Der Grund, dass df['event'].value_counts() die leere Zeile nicht angezeigt hat, ist, weil pandas.Series.value_count() einen optionalen Parameter dropna=True übernimmt; Dieser Parameter ignoriert standardmäßig alle Null/NaN/np.nan/None Werte. Hier ist ein kurzes Beispiel, dies zu zeigen:

In [1]: import pandas as pd 

In [2]: import numpy as np 

In [3]: df = pd.DataFrame(columns=['a']) 

In [4]: df['a'] = ['so', 'map', 'map', 'lol', np.nan, 'so', 'so', 'so', 'lol', np.nan] 

In [5]: df['a'].value_counts() 
Out[5]: 
so  4 
lol 2 
map 2 
dtype: int64 

In [6]: df['a'].value_counts(dropna=False) 
Out[6]: 
so  4 
lol 2 
map 2 
NaN 2 
dtype: int64 

In der Ausgabe Linie 6 können Sie sehen, dass NaN als eine andere Klasse kommt, obwohl standardmäßig (Ausgabe 5 zu Linie) ist es nicht da. Wenn Sie diesen optionalen Parameter als False übergeben hätten, hätten Sie die Nullzeile im Voraus gelesen.

Ich hoffe, das macht Sinn!

+1

Das ist großartig, wird in der Zukunft hilfreich sein. – GNMO11

Verwandte Themen