Sie möchten Pandas Dataframe als Multiple Histogramme mit der X-Achse log10 skalieren

8

Ich habe Fließkommadaten in einem Pandas-Datenrahmen. Jede Spalte repräsentiert eine Variable (sie haben String-Namen) und jede Zeile eine Menge von Werten (die Zeilen haben Integer-Namen, die nicht wichtig sind).

%Vor%

Ich möchte für jede Spalte ein Histogramm erstellen. Das beste Ergebnis, das ich erreicht habe, ist mit der hist-Methode des Datenrahmens:

%Vor%

aber ich möchte, dass die x-Achse jedes Histogramms auf einer log10-Skala liegt. Und die Bins müssen ebenfalls log10 sein, aber das ist einfach genug mit bins = np.logspace (-2,2,20).

Eine Problemumgehung könnte darin bestehen, log10 die Daten vor dem Zeichnen zu transformieren, aber die Ansätze, die ich versucht habe,

%Vor%

und

%Vor%

Gib mir einen Gleitkommafehler.

%Vor%     
Simon Woodward 28.04.2015, 21:34
quelle

1 Antwort

5

Sie könnten

verwenden %Vor%

data.hist() gibt ein Array von Achsen zurück. Du musst anrufen ax.set_xscale('log') für jede Achse, ax , um jede der logarithmischen zu machen skaliert.

Zum Beispiel

%Vor%

ergibt

Übrigens, um das Protokoll aller Werte im DataFrame, data , zu verwenden, könnten Sie

verwenden %Vor%

weil NumPy ufuncs (wie np.log10 ) auf Pandas DataFrames angewendet werden kann, weil sie elementweise auf alle Werte im DataFrame .

data.apply(math.log10) hat nicht funktioniert, weil apply versucht, eine ganze Spalte (eine Reihe) von Werten an math.log10 zu übergeben. math.log10 erwartet nur einen skalaren Wert.

data.apply(lambda x: math.log10(x)) schlägt aus dem gleichen Grund wie data.apply(math.log10) fehl. Wenn außerdem data.apply(func) und data.apply(lambda x: func(x)) beide brauchbare Optionen wären, sollte die erste bevorzugt werden, da die Lambda-Funktion den Aufruf nur etwas langsamer machen würde.

Sie könnten auch data.apply(np.log10) verwenden, da NumPy ufunc np.log10 auf Series angewendet werden kann, aber es gibt keinen Grund, dies zu tun, wenn np.log10(data) funktioniert.

Sie können auch data.applymap(math.log10) seit applymap aufrufen math.log10 für jeden Wert in data eins nach dem anderen. Aber das wäre viel langsamer als Aufruf der entsprechenden NumPy-Funktion, np.log10 auf der gesamten Datenrahmen. Dennoch ist es wichtig, über applymap zu wissen, falls Sie anrufen müssen einige benutzerdefinierte Funktion, die keine ufunc ist.

    
unutbu 28.04.2015, 22:07
quelle