2017-10-25 2 views
1

Ich möchte gelten log2 mit applymap und np2.log2 auf eine Daten anwenden und zeigen Sie es mit boxplot, hier ist der Code, den ich geschrieben habe:Wie log2 Transformation (mit applymap und np.log2) zu einem Panda Dataframe

import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 

data = pd.read_csv('testdata.csv') 
df = pd.DataFrame(data) 

################################ 
    # a. 
df.boxplot() 
plt.title('Raw Data') 

################################ 
    # b. 
df.applymap(np.log2) 
df.boxplot() 
plt.title('Normalized Data') 

und unten ist der Boxplot, den ich für meine RAW-Daten bekomme, was in Ordnung ist, aber ich bekomme den gleichen Boxplot nach Anwendung von log2-Transformation !!! kann mir jemand bitte sagen, was ich falsch mache und was korrigiert werden sollte die normalisierten Daten mit applymap und np.log2 enter image description here

+1

versuchen Sie 'df = df.applymap (yourfunc)' [API-Referenz] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.applymap.html#pandas-dataframe-applymap) –

+0

Sie ändern nichts mit 'df.applymap (np.log2)', das zurückgegebene Ergebnis wird anschließend nicht verwendet. Verwenden Sie 'df2 = df.applymap (np.log2)' und verwenden Sie das neue df zum Plotten. –

+0

wow great @ShiheZhang Ich habe so viel Zeit auf diesen sehr kleinen Punkt verschwendet, danke! – Hazmat

Antwort

1

Nach API ReferenceDataFrame.applymap(func)

eine Funktion Nehmen, um einen Datenrahmen, die element arbeiten soll, dh wie Karte tun (func, Serie) für jede Reihe in der Datenrahmen

Es wird die DataFrame nicht ändern, die Sie benötigen, um den Rückgabewert zu erhalten und es zu verwenden.

+0

Während das, was du vorschlägst, nicht _wrong_ ist, ist es schrecklich ineffizient, wenn numpy gleich gut mit dem gesamten Datenrahmen gleichzeitig arbeiten kann. Ich habe meiner Antwort einige Zeitpunkte hinzugefügt, damit Sie sehen können, was vor sich geht. 'applymap' ist nicht besser als eine verschachtelte Schleife. –

+0

Das könnte eine andere Frage sein "Was ist der effiziente Weg, Log2 mit jedem Element im Datenrahmen zu tun". Und Sie hätten Recht. –

1

A viel schnelleren Weg, dies zu tun, wäre zu bekommen:

df = np.log2(df) 

Vergessen Sie nicht, das Ergebnis wieder df zuzuweisen.


df 

    A B C 
0 18 35 28 
1 137 29 53 
2 76 20 51 
3 71 40 77 
4 130 58 177 
5 57 96 65 
6 22 33 32 
7 163 64 118 
8 14 111 104 
9 100 23 151 

np.log2(df) 

      A   B   C 
0 4.169925 5.129283 4.807355 
1 7.098032 4.857981 5.727920 
2 6.247928 4.321928 5.672425 
3 6.149747 5.321928 6.266787 
4 7.022368 5.857981 7.467606 
5 5.832890 6.584963 6.022368 
6 4.459432 5.044394 5.000000 
7 7.348728 6.000000 6.882643 
8 3.807355 6.794416 6.700440 
9 6.643856 4.523562 7.238405 

Diese prüft als applymap mit dem gleichen Ergebnis aus. Die Magie hier ist die Fähigkeit von numpy, Operationen zu vektorisieren.


Leistung

%timeit df.applymap(np.log2) 
1000 loops, best of 3: 1.2 ms per loop 
%timeit np.log2(df) 
10000 loops, best of 3: 140 µs per loop 

Sie die maximal mögliche Beschleunigung erreichen, indem man seine vektorisiert Magie numpy zu arbeiten.

+0

Danke coldspeed, ich werde deine + ve advice behalten, aber ich habe Hausaufgaben und das erfordert, dass ich applymap & np.log2 benutze, also ich wird @Shihe Zhangs Antwort als genehmigte Antwort nehmen – Hazmat

+0

@Hazmat Ich verstehe Hausaufgaben ist Ihre höchste Priorität, aber schauen Sie sich das größere Bild hier. Wie auch immer, Sie können alle Antworten abstimmen, auch wenn Sie nur eine annehmen können. –

+0

Okay, das klingt legitim für mich, und auf lange Sicht würde ich definitiv die Antwort verwenden, die du geliefert hast ('df = np.log2 (df)')! Also habe ich deine Antwort auch getippt :) – Hazmat

Verwandte Themen