2016-06-26 11 views
0

ich einen Datensatz mit rund 2 Millionen Zeilen haben und 50 SpaltenProbleme mit dem Entfernen von konstanten Funktionen unter Verwendung von Standardabweichung Python Pandas

ich einige dieser Spalten wissen konstante Datenwerte - z alle Zeilen in dieser Spalte den gleichen Wert

Deshalb dachte ich, dass ich mit allen konstanten Spalten zu finden wäre in der Lage:

for col in data.columns: 
    print data[col].std() 

jedoch die Spalte (n) mit 0 Standardabweichungen, kehren mich etwa Standardabweichungen 0,000000012 (sehr geringe Abweichungen - nicht 0)

ich alle Werte überprüft haben, sind konstant durch die folgende

print data[data['col3'] != 0.538] 

W läuft hich gibt ein leeres Array zurück (alle Werte sind 0,538 für diese Spalte)

Warum gibt die Standardabweichung 0 für diese Spalte nicht zurück?

Entschuldigung für das Posten einer solchen spezifischen Frage, aber ich bin sehr verwirrt darüber, wie das funktioniert.

Jeder Rat würde sehr geschätzt werden.

Danke, J

+0

Haben Sie versucht, nach 'ddof = 0' zu suchen, da pandas' ddof = 1' als Standardwert betrachtet? –

+0

Sie können value_counts oder unique als Selektor ausprobieren. – Merlin

Antwort

0

Zum Beispiel aus link genommen:

>>> 0.1 + 0.2 
0.30000000000000004 

Warum ist das so? 1/10 und 2/10 sind nicht genau als binärer Bruch darstellbar. Fast alle Maschinen verwenden heute IEEE-754 Fließkomma-Arithmetik (Juli 2010), und fast alle Plattformen ordnen Python-Gleitkommazahlen IEEE-754 "doppelter Genauigkeit" zu. 754 doubles enthalten 53 Genauigkeitsbits. Bei der Eingabe versucht der Computer, 0,1 in den nächstliegenden Bruchteil der Form J/2 ** N zu konvertieren, wobei J eine ganze Zahl ist, die genau 53 Bits enthält.
Und mit anderen Worten: Sie können Ihre Ausgabe als Null betrachten.

1

Das scheint wie ein floating point issue.

Sie können numpys isclose verwenden, um zu überprüfen, ob die Standardabweichung nahe bei Null liegt. Allerdings gibt dies auch True zurück, wenn sich beispielsweise nur einige Werte in der Reihe von den anderen unterscheiden. In diesem Fall ist die Verwendung der Standardabweichung, um sicherzustellen, dass alle Werte gleich sind, möglicherweise nicht der beste Weg. Stattdessen würde ich vorschlagen, eine vektorisierte Gleichheitsprüfung mit np.isclose zu verwenden (d. H. Prüfen, ob alle Werte sehr nahe dem ersten sind). Beachten Sie, dass data[data['col3'] != 0.538] das gleiche Risiko birgt, wenn die Zahlen schweben. Sie sollten nicht auf Gleichheit/Ungleichheit beim Floaten prüfen.

np.isclose(data['col3'], data['col3'][0]).all() 
Out[19]: True 

Sie können auch die Toleranz für basierend auf Ihrem realen Datensatz angeben.

+1

Danke für die 'np.isclose()'! Ich wusste es nicht ... – MaxU