2017-12-20 6 views
2

Eine Anfängerfrage: Ich versuche, den Mittelwert in einer Spalte von einem Datenrahmen zu berechnen, aber aus irgendeinem Grund, trotz der Verwendung von np.nanmean, gibt es mir das falsche Ergebnis (d. H. Es zählt die Nullen innerhalb des Nenners). np.nanmean funktioniert nicht in einem Dataframe?

Wie ich weiß nicht, wie in den Tabellen in dieser Frage einzufügen (! Irgendwelche Ratschläge wäre toll), hier ist ein Beispiel für das Problem das ich habe:

22.0 
0 
0 
0 
35 

Das bin ich eine geben sollte Mittelwert von 28.5, aber wenn ich einlege:

np.nanmean(df) 

Es gibt nur 11.4 zurück.

Jetzt habe ich mit Achseneinstellungen experimentiert, und auch versucht, meine 0s als numpy NaNs zu setzen, aber keiner von beiden scheint zu funktionieren.

Abgesehen davon, dass ich das manuell mache, gibt es etwas Einfaches, was ich vernachlässige innerhalb der Numpy/Panda-Bibliotheken?

+3

Sie verstehen grundsätzlich nan, was bedeutet "keine Zahl" wie fehlende Daten oder das Ergebnis einer ungültigen Operation (z. B. Division durch Null). Null ist eine gültige Zahl (wie Schwarz ist eine gültige Farbe, ich denke; zugegebenermaßen können Nullen von Python als falsch interpretiert werden, wenn Zahlen implizit als boolesche Zahlen behandelt werden, aber im Allgemeinen sind Nullen gültige Zahlen und werden sicherlich als gültig betrachtet für irgendwelche numerischen Methoden wie Durchschnitt, Maximum, etc. – JohnE

+0

Hi JohnE - es ist ein sehr gerechter Punkt, den Sie machen. Ich vermute, was meine anfängliche Verwirrung verursachte, war, dass ich versuchte, diese 0 in np.nans zu konvertieren, was aus irgendeinem Grund nicht funktionierte (in Bezug auf meinen Mittelwert). Daher habe ich mich zunächst gefragt, ob da noch was anderes ist, aber schätze deine Kommentare – Foxtrot82

Antwort

3

dieses comment Weggehen von @JohnE hier als geeignet Präambel für diesen Beitrag.

Sie sind grundlegend Mißverständnis nan, das bedeutet „keine Zahl“ wie fehlende Daten oder das Ergebnis einer ungültigen Operation (z.B. dividieren durch Null). Null ist eine gültige Zahl (wie Schwarz ist eine gültige Farbe, ich denke, ;-) zugegebenermaßen können Nullen von Python als falsch interpretiert werden, wenn Zahlen implizit als Boolean behandelt werden, aber im Allgemeinen Nullen sind gültige Zahlen und sicherlich gelten gültig für alle numerische Methoden wie Mittelwert, max usw.


meiner Meinung nach, wäre eine gute Lösung beinhalten mask -

s 

0 22.0 
1  0.0 
2  0.0 
3  0.0 
4 35.0 
Name: 0, dtype: float64 
s.mask(s.eq(0)).mean() 
28.5 

Oder

np.nanmean(s.mask(s.eq(0)).values) 
28.5 

Der Vorteil dieser Lösung ist, dass es für Series sowie DataFrame Objekte funktioniert.


Wenn Sie eine Serie (oder einen einzelnen Spalten-Datenrahmen) haben, vereinfacht sich die Lösung. Sie könnten eine boolesche Indizierung durchführen, um 0 Zeilen loszuwerden, und dann call mean aufrufen.

s[s != 0].mean() 
28.5 

Alternativ rufen mean auf dem values. Dies sollte viel schneller sein.

+0

Danke nochmal, Coldspeed - schätze deine Hilfe wirklich! – Foxtrot82

+0

Hallo Coldspeed, sie waren beide sehr hilfreich. Ich fand, dass Ihre Antwort auch dazu beigetragen hat, mehr über die Besonderheiten von Python zu erfahren, angesichts der verschiedenen Optionen, die Sie erwähnt haben. – Foxtrot82

+0

@ Foxtrot82 Ich sehe ... Danke, dass Sie mich wissen lassen. Auch wenn Sie nur eine Antwort akzeptieren können, können Sie sie alle aufwerten. Schöne Ferien. –

0

Es scheint, Sie 0-NaN s ersetzen müssen und bekommen mean s:

print (np.nanmean(df.replace(0,np.nan))) 
28.5 

in Pandas NaN s sind omited:

print (df) 
     a 
0 22.0 
1 0.0 
2 0.0 
3 0.0 
4 35.0 

print (df.replace(0,np.nan).mean()) 
a 28.5 
dtype: float64 
Verwandte Themen