2016-07-12 18 views
4

Ich lerne die verschiedenen Aspekte von Python Pandas und ich stolperte über einige seltsame Verhalten der Median-Funktion für groupby-Objekte, wenn es für binned Daten verwendet wird.Pandas groupby-median Funktion füllt leere Bins mit Zufallszahlen

Beispielcode:

import pandas as pd 

d = pd.DataFrame([1,2,5,6,9,3,6,5,9,7,11,36,4,7,8,25,8,24,23]) 

b = [0,5,10,15,20,25,30,35,40,45,50,55] 

print d.groupby(pd.cut(d[0],b)).count() 

print d.groupby(pd.cut(d[0],b)).mean() 

print d.groupby(pd.cut(d[0],b)).median() 

Ausgang für Zahl:

(0, 5] 6 
(5, 10] 8 
(10, 15] 1 
(15, 20] 0 
(20, 25] 3 
(25, 30] 0 
(30, 35] 0 
(35, 40] 1 
(40, 45] 0 
(45, 50] 0 
(50, 55] 0 

Ausgang für Mittelwert:

(0, 5]  3.333333 
(5, 10] 7.500000 
(10, 15] 11.000000 
(15, 20]  NaN 
(20, 25] 24.000000 
(25, 30]  NaN 
(30, 35]  NaN 
(35, 40] 36.000000 
(40, 45]  NaN 
(45, 50]  NaN 
(50, 55]  NaN 

Ausgang für Median:

(0, 5]  3.5 
(5, 10] 7.5 
(10, 15] 11.0 
(15, 20] 18.0 
(20, 25] 24.0 
(25, 30] 30.5 
(30, 35] 30.5 
(35, 40] 36.0 
(40, 45] 18.0 
(45, 50] 18.0 
(50, 55] 18.0 

Alle leeren Behälter sind mit den Nummern 18 und 30.5 gefüllt, was hier keinen Sinn ergibt.

Auch die letzten drei Zahlen änderten sich zufällig, wenn ich eine Nummer in der ursprünglichen Liste geändert wird, dann habe ich eine Ausgabe wie folgt aus:

(0, 5]  3.500000e+00 
(5, 10] 7.500000e+00 
(10, 15] 1.100000e+01 
(15, 20] 1.800000e+01 
(20, 25] 2.450000e+01 
(25, 30] 3.050000e+01 
(30, 35] 3.050000e+01 
(35, 40] 3.600000e+01 
(40, 45] 3.814316e+228 
(45, 50] 3.814316e+228 
(50, 55] 3.814316e+228 

eine andere Nummer in der Liste ändern würde mich Ausgang mit der Nummer 18 geben Am Ende nochmal.

Ist das nur ein Fehler?

Gibt es gültige Gründe für dieses Verhalten?

Mache oder interpretiere ich hier etwas falsch?

Im Moment muss ich die NaN-Ausgabe der Mean-Funktion verwenden, um leere Median-Bins herauszufiltern, aber ich denke, der Median sollte leere Werte genauso behandeln wie der Mittelwert.

+1

Ich bin nicht sicher, warum das dir so ein Ergebnis geben würde ... Aber Sie können verwenden [apply] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.groupby.GroupBy.apply.html): '' 'd.groupby (pd.cut (d [0] , b)). apply (numpy.median) '' ' – dermen

+1

Es sieht aus wie ein Fehler. Sie können [hier] melden (https://github.com/pydata/pandas/issues). – ayhan

+0

Danke, ich habe gerade einen Fehlerbericht geschrieben. – Khris

Antwort

1

Ich bin mir ziemlich sicher, dass es ein Fehler:

Bedenken Sie:

gb = d.groupby(pd.cut(d[0],b)) 

gb.median() 

enter image description here

aber:

gb.get_group('(0, 5]').median() 

0 3.5 
dtype: float64 

und:

gb.get_group('(15, 20]').median() 
KeyError         Traceback (most recent call last) 
<ipython-input-314-e1f4657d9a2d> in <module>() 
----> 1 gb.get_group('(15, 20]').median() 

/Users/me/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in get_group(self, name, obj) 
    585   inds = self._get_index(name) 
    586   if not len(inds): 
--> 587    raise KeyError(name) 
    588 
    589   return obj.take(inds, axis=self.axis, convert=False) 

KeyError: '(15, 20]' 

Es berechnet median auf dem groupby Objekt, wenn die Gruppe nicht einmal existiert.