Dies ist Teil zwei eines zweiteiligen Tutorials zu Pandas, dem erstaunlichen Python Data Analytics Toolkit.
Im ersten Teil haben wir die grundlegenden Datentypen von Pandas behandelt: die Serie und den Datenrahmen. Wir importierten und exportierten Daten, wählten Teilmengen von Daten aus, arbeiteten mit Metadaten und sortierten die Daten.
In diesem Teil werden wir unsere Reise fortsetzen und uns mit fehlenden Daten, Datenmanipulation, Datenzusammenführung, Datengruppierung, Zeitreihen und Plotten befassen.
Eine der Stärken der Pandas ist der Umgang mit fehlenden Werten. Es wird nicht nur abstürzen und brennen, wenn Daten fehlen. Wenn Daten fehlen, werden sie von Pandas durch np.nan (keine Zahl) von numpy ersetzt und nehmen an keiner Berechnung teil.
Lassen Sie uns unseren Datenrahmen neu indizieren und weitere Zeilen und Spalten hinzufügen, jedoch ohne neue Daten. Um es interessant zu machen, füllen wir einige Werte auf.
>>> df = pd.DataFrame (np.random.randn (5,2), index = index, spalten = ['a', 'b'])> >> new_index = df.index.append (pd.Index (['six'])) >>> new_columns = list (df.columns) + ['c'] >>> df = df.reindex (index = neuer_index, Spalten = neue_columns) >>> df.loc [' three ']. c = 3 >>> df.loc [' four ']. c = 4 >>> df abc one -0,042172 0,374922 NaN zwei -0,689523 1,411403 NaN drei 0,332707 0,307561 3,0 vier 0,426519 -0,425181 4,0 fünf -0,161095 0,849932 NaN sechs NaN NaN NaN
Beachten Sie, dass df.index.append ()
kehrt zurück Neu Index und ändert den vorhandenen Index nicht. Ebenfalls, df.reindex ()
kehrt zurück Neu Datenrahmen, den ich wieder dem df
Variable.
Zu diesem Zeitpunkt hat unser Datenrahmen sechs Zeilen. Die letzte Zeile enthält alle NaNs und alle anderen Zeilen außer der dritten und der vierten Zeile haben NaN in der Spalte "c". Was können Sie mit fehlenden Daten tun? Hier sind Optionen:
Bewahren Sie die fehlenden Daten auf --------------------- >>> df * = 2 >>> df abc one -0.084345 0.749845 NaN zwei -1.379046 2.822806 NaN drei 0.665414 0.615123 6.0 vier 0.853037 -0.850362 8.0 fünf -0.322190 -1.699864 NaN sechs NaN NaN NaN Zeilen mit fehlenden Daten löschen --------------------------- >> > df.dropna () abc three 0.665414 0.615123 6.0 vier 0.853037 -0.850362 8.0 Durch Standardwert ersetzen ---------------------- >>> df .fillna (5) abc one -0,084345 0,749845 5,0 zwei -1,379046 2,822806 5,0 drei drei 0,665414 0,615123 6,0 vier 0,853037 -0,850362 8,0 fünf -0,322190 -1,699864 5,0 sechs fünfzehn 8000000 5,000000 5,0
Wenn Sie nur überprüfen möchten, ob in Ihrem Datenrahmen Daten fehlen, verwenden Sie die ist Null()
Methode. Dies gibt eine boolesche Maske Ihres Datenrahmens zurück Wahr
für fehlende Werte und Falsch
anderswo.
>>> df.isnull () a b c eins Falsch Falsch Richtig Zwei Falsch Falsch Richtig Drei Falsch Falsch Falsch Vier Falsch Falsch Falsch Fünf Falsch Falsch Richtig Wahr Richtig
Wenn Sie einen Datenrahmen haben, müssen Sie häufig Vorgänge an den Daten durchführen. Beginnen wir mit einem neuen Datenrahmen, der vier Zeilen und drei Spalten mit Zufallszahlen zwischen 1 und 9 (einschließlich) enthält..
>>> df = pd.DataFrame (np.random.randint (1, 10, size = (4, 3)), Spalten = ['a', 'b', 'c']) >>> df abc 0 1 3 3 1 8 9 2 2 8 1 5 3 4 6 1
Nun können Sie mit den Daten beginnen. Lassen Sie uns alle Spalten zusammenfassen und das Ergebnis der letzten Zeile zuordnen. Dann summieren Sie alle Zeilen (Dimension 1) und weisen Sie der letzten Spalte zu:
>>> df.loc [3] = df.sum () >>> df abc 0 1 3 3 1 8 9 2 2 8 1 5 3 21 19 11 >>> df.c = df.sum (1)> >> df abc 0 1 3 7 1 8 9 19 2 8 1 14 3 21 19 51
Sie können auch Operationen für den gesamten Datenrahmen ausführen. Hier ist ein Beispiel für das Subtrahieren von 3 von jeder einzelnen Zelle:
>>> df - = 3 >>> df a b c 0 -2 0 4 1 5 6 16 2 5 -2 11 3 18 16 48
Für die vollständige Kontrolle können Sie beliebige Funktionen anwenden:
>>> df.app (Lambda x: x ** 2 + 5 * x - 4) a b c 0 -10 -4 32 1 46 62 332 2 46 -10 172 3 410 332 2540
Ein anderes häufiges Szenario bei der Arbeit mit Datenrahmen ist das Kombinieren und Zusammenführen von Datenrahmen (und Serien). Pandas gibt Ihnen wie üblich verschiedene Möglichkeiten. Lassen Sie uns einen weiteren Datenrahmen erstellen und die verschiedenen Optionen erkunden.
>>> df2 = df // 3 >>> df2 a b c 0 -1 0 1 1 2 5 2 1 -1 3 3 6 5 16
Bei Verwendung von pd.concat verkettet pandas einfach alle Zeilen der bereitgestellten Teile in der angegebenen Reihenfolge. Es gibt keine Ausrichtung von Indizes. Sehen Sie im folgenden Beispiel, wie doppelte Indexwerte erstellt werden:
>>> pd.concat ([df, df2]) a b c 0 -2 0 4 1 5 6 16 2 5 -2 11 3 18 16 48 0 -1 1 1 1 2 5 2 1 -1 3 3 5 5 16
Sie können Spalten auch mit der Option verketten Achse = 1
Streit:
>>> pd.concat ([df [: 2], df2], Achse = 1) abcabc 0 -2,0 0,0 4,0 -1 0 1 1 5,0 6,0 16,0 1 2 5 2 NaN NaN NaN 1 -1 3 3 NaN NaN NaN 6 5 16
Da der erste Datenrahmen (ich habe nur zwei Zeilen verwendet) nicht so viele Zeilen hatte, wurden die fehlenden Werte automatisch mit NaNs aufgefüllt, wodurch diese Spaltentypen von int in float geändert wurden.
Es ist möglich, eine beliebige Anzahl von Datenrahmen in einem Anruf zu verketten.
Die Merge-Funktion verhält sich ähnlich wie die SQL-Verknüpfung. Es führt alle Spalten aus Zeilen mit ähnlichen Schlüsseln zusammen. Beachten Sie, dass es nur für zwei Datenrahmen gilt:
>>> df = pd.DataFrame (dict (key = ['start', 'finish'], x = [4, 8])) >>> df-Taste x 0 start 4 1 finish 8 >>> df2 = pd .DataFrame (dict (key = ['start', 'finish'], y = [2, 18])) >>> df2 key y 0 start 2 1 beenden 18 >>> pd.merge (df, df2, ein = "Schlüssel") Taste xy 0 start 4 2 1 fertig 8 18
Der Datenrahmen ist anhängen ()
Methode ist eine kleine Abkürzung. Es verhält sich funktional wie concat ()
, spart aber einige Tastenanschläge.
>>> df-Taste x 0 Anfang 4 1 Ende 8 Anhängen einer Zeile mit der Append-Methode () ----------------------------- -------------- >>> df.append (dict (Schlüssel = 'middle', x = 9), ignore_index = True) Taste x 0 Start 4 1 Ende 8 2 Mitte 9 Anhängen eine Zeile mit dem concat () --------------------------------------- >>> pd.concat ([df, pd.DataFrame (dict (Schlüssel = 'middle', x = [9]))], ignore_index = True) Taste x 0 Start 4 1 Ende 8 2 Mitte 9
Hier ist ein Datenrahmen, der die Mitglieder und das Alter von zwei Familien enthält: die Smiths und die Joneses. Du kannst den ... benutzen gruppiere nach()
Methode zum Gruppieren von Daten nach Nachnamen und Auffinden von Informationen auf Familienebene, z. B. Alterssumme und Durchschnittsalter:
df = pd.DataFrame (dict (zuerst = 'John Jim Jenny Jill Jack'.split (), letzte = "Smith Jones Jones Smith Smith" .split (), Alter = [11, 13, 22, 44, 65]) ) >>> df.groupby ('last'). sum () alter letzter Jones 35 Smith 120 >>> df.groupby ('last'). mean () alter letzter Jones 17.5 Smith 40.0
Viele wichtige Daten sind Zeitreihendaten. Pandas bietet eine starke Unterstützung für Zeitreihendaten, angefangen bei Datenbereichen über Lokalisierung und Zeitkonvertierung bis hin zu anspruchsvollem frequenzbasiertem Resampling.
Das Datumsbereich()
Funktion kann Sequenzen von Datumszeiten erzeugen. Hier ein Beispiel für die Generierung eines Zeitraums von sechs Wochen ab 1. Januar 2017 unter Verwendung der UTC-Zeitzone.
>>> Wochen = pd.date_range (Start = '1/1/2017', Perioden = 6, Freq = "W", tz = "UTC") >>> Wochen DatetimeIndex (['2017-01-01', '2017-01-08', '2017-01-15', '2017-01-22', '2017-01-29', '2017-02-05'], dtype = "datetime64 [ns, UTC] ", freq =" W-SUN ")
Das Hinzufügen eines Zeitstempels zu Ihren Datenframes, entweder als Datenspalte oder als Index, eignet sich hervorragend zum Organisieren und Gruppieren Ihrer Daten nach Zeit. Es erlaubt auch ein Resampling. Hier ist ein Beispiel für das erneute Abtasten von Minutendaten in fünfminütigen Aggregationen.
>>> Minuten = pd.date_range (Start = '1/1/2017', Perioden = 10, Freq = "1Min", tz = "UTC") >>> ts = pd.Series (np.random.randn ( len (Minuten)), Minuten) >>> ts 2017-01-01 00: 00: 00 + 00: 00 1.866913 2017-01-01 00: 01: 00 + 00: 00 2.157201 2017-01-01 00:02 : 00 + 00: 00 -0,439932 2017-01-01 00: 03: 00 + 00: 00 0,777944 2017-01-01 00: 04: 00 + 00: 00 0,755624 2017-01-01 00: 05: 00 + 00 : 00 -2.150276 2017-01-01 00: 06: 00 + 00: 00 3.352880 2017-01-01 00: 07: 00 + 00: 00 -1.657432 2017-01-01 00: 08: 00 + 00: 00 - 0,144666 2017-01-01 00: 09: 00 + 00: 00 -0,667059 Freq: T, dtype: float64 >>> ts.resample ('5Min'). Mean () 2017-01-01 00: 00: 00+ 00:00 1.023550 2017-01-01 00: 05: 00 + 00: 00 -0,253311
Pandas unterstützt das Plotten mit Matplotlib. Stellen Sie sicher, dass es installiert ist: pip install matplotlib
. Um ein Diagramm zu erstellen, können Sie das aufrufen Handlung()
einer Serie oder eines Datenrahmens. Es gibt viele Optionen zum Steuern der Darstellung, die Standardeinstellungen sind jedoch für einfache Visualisierungszwecke geeignet. So erstellen Sie ein Liniendiagramm und speichern es in einer PDF-Datei.
ts = pd.Series (np.random.randn (1000), index = pd.date_range ('1/1/2017', Perioden = 1000)) ts = ts.cumsum () ax = ts.plot () fig = ax.get_figure () fig.savefig ('plot.pdf')
Beachten Sie, dass unter macOS Python als Framework zum Plotten mit Pandas installiert werden muss.
Pandas ist ein sehr breites Datenanalyse-Framework. Es verfügt über ein einfaches Objektmodell mit den Konzepten von Serien und Datenrahmen und einer Fülle an integrierten Funktionen. Sie können Pandafunktionen und Ihre eigenen Algorithmen zusammenstellen und mischen.
Zögern Sie nicht, zu sehen, was wir auf dem Markt zum Verkauf und zum Lernen zur Verfügung haben, und zögern Sie nicht, Fragen zu stellen und mit dem untenstehenden Feed wertvolles Feedback zu geben.
Der Datenimport und -export in Pandas ist ebenfalls sehr umfangreich und gewährleistet, dass Sie diese problemlos in vorhandene Systeme integrieren können. Wenn Sie Daten in Python verarbeiten, gehören Pandas zu Ihrer Toolbox.