Data Manipulation mit Pandas
Inhaltsverzeichnis
- Creating, Reading and Writing
- Indexing, Selecting & Assigning
- Summary Functions and Maps
- Grouping and Sorting
- Data Types and Missing Values
- Renaming and Combining
- Fortgeschrittene Techniken
1. Creating, Reading and Writing
Sie können nicht mit Daten arbeiten, wenn Sie sie nicht lesen können. Hier finden Sie den Einstieg.
DataFrame erstellen
import pandas as pd
# DataFrame aus einem Dictionary erstellen
df = pd.DataFrame({'Yes': [50, 21], 'No': [131, 2]})
print(df)
Yes No 0 50 131 1 21 2
Hier wird ein DataFrame aus einem Dictionary erstellt. Jeder Schlüssel im Dictionary wird zu einer Spalte, und die zugehörigen Listen werden zu den Werten in diesen Spalten.
CSV-Datei einlesen
wine_reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
print(wine_reviews.head())
country description ... variety winery 0 Italy Aromas include tropical fruit, broom, brimston... ... White Blend Nicosia 1 Portugal This is ripe and fruity, a wine that is smooth... ... Portuguese Red Quinta dos Avidagos 2 US Tart and snappy, the flavors of lime flesh and... ... Pinot Gris Rainstorm 3 US Pineapple rind, lemon pith and orange blossom ... ... Riesling St. Julian 4 US Much like the regular bottling from 2012, this... ... Pinot Noir Sweet Cheeks [5 rows x 12 columns]
Diese Methode liest eine CSV-Datei ein und erstellt daraus ein DataFrame. Der Parameter index_col=0 legt fest, dass die erste Spalte als Index verwendet wird. head() zeigt die ersten 5 Zeilen des DataFrame an.
DataFrame-Informationen
print(wine_reviews.shape)
(129971, 14)
Die shape-Eigenschaft gibt ein Tupel zurück, das die Anzahl der Zeilen und Spalten des DataFrame enthält. Hier sehen wir, dass der DataFrame 129.971 Zeilen und 14 Spalten hat.
2. Indexing, Selecting & Assigning
Professionelle Data Scientists führen dies dutzende Male am Tag durch. Sie können es auch!
Spaltenauswahl
print(reviews.country)
print(reviews['country'])
0 Italy
1 Portugal
...
129969 France
129970 France
Name: country, Length: 129971, dtype: object
Beide Methoden wählen die 'country'-Spalte aus. Die Punkt-Notation (reviews.country) ist kürzer, aber die Klammer-Notation (reviews['country']) ist flexibler und funktioniert auch bei Spaltennamen mit Leerzeichen oder Sonderzeichen.
Indexing mit loc und iloc
print(reviews.iloc[0]) # Erste Zeile
print(reviews.loc[0, 'country']) # Wert in der ersten Zeile, Spalte 'country'
print(reviews.iloc[:, 0]) # Erste Spalte
print(reviews.iloc[:3, 0]) # Erste drei Zeilen der ersten Spalte
print(reviews.iloc[1:3, 0]) # Zweite und dritte Zeile der ersten Spalte
print(reviews.iloc[[0, 1, 2], 0]) # Erste, zweite und dritte Zeile der ersten Spalte
print(reviews.iloc[-5:]) # Letzte 5 Zeilen
iloc verwendet numerische Indizes, während loc Label-basiert ist.
reviews.iloc[0]: Wählt die erste Zeile aus.reviews.loc[0, 'country']: Wählt den Wert in der ersten Zeile der 'country'-Spalte aus.reviews.iloc[:, 0]: Wählt alle Zeilen der ersten Spalte aus.reviews.iloc[:3, 0]: Wählt die ersten drei Zeilen der ersten Spalte aus.reviews.iloc[1:3, 0]: Wählt die zweite und dritte Zeile der ersten Spalte aus.reviews.iloc[[0, 1, 2], 0]: Wählt spezifische Zeilen (hier: erste, zweite und dritte) der ersten Spalte aus.reviews.iloc[-5:]: Wählt die letzten 5 Zeilen aller Spalten aus.
Bedingte Auswahl
print(reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)])
print(reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)])
print(reviews.loc[reviews.country.isin(['Italy', 'France'])])
print(reviews.loc[reviews.price.notnull()])
Diese Beispiele zeigen verschiedene Methoden der bedingten Auswahl:
- Die erste Zeile wählt alle Weine aus Italien mit 90 oder mehr Punkten aus.
- Die zweite Zeile wählt alle Weine aus, die entweder aus Italien stammen oder 90 oder mehr Punkte haben.
- Die dritte Zeile wählt alle Weine aus Italien oder Frankreich aus.
- Die letzte Zeile wählt alle Zeilen aus, bei denen der Preis nicht null ist.
3. Summary Functions and Maps
Extrahieren Sie Erkenntnisse aus Ihren Daten.
Zusammenfassende Statistiken
print(reviews.points.describe())
print(reviews.taster_name.describe())
print(reviews.points.mean())
print(reviews.taster_name.unique())
print(reviews.taster_name.value_counts())
describe() gibt eine Übersicht über statistische Kennzahlen. Für numerische Daten enthält dies Mittelwert, Standardabweichung, Minimum, Maximum und Quartile. Für kategorische Daten zeigt es die Anzahl der Einträge, einzigartige Werte, häufigste Werte und deren Häufigkeit.
unique() gibt alle einzigartigen Werte in einer Spalte zurück.
value_counts() zählt, wie oft jeder einzigartige Wert vorkommt.
Maps
review_points_mean = reviews.points.mean()
print(reviews.points.map(lambda p: p - review_points_mean))
def remean_points(row):
row.points = row.points - review_points_mean
return row
print(reviews.apply(remean_points, axis='columns'))
print(reviews.country + " - " + reviews.region_1)
map() wendet eine Funktion auf jedes Element einer Series an. Hier wird von jedem Punktwert der Durchschnitt abgezogen.
apply() ist ähnlich wie map(), kann aber auf ganze DataFrames angewendet werden. Hier wird die Funktion remean_points auf jede Zeile angewendet.
Der letzte Befehl demonstriert die Verkettung von Strings in Pandas, indem er den Ländernamen mit der Region_1 verbindet.
4. Grouping and Sorting
Skalieren Sie Ihr Erkenntnislevel. Je komplexer der Datensatz, desto wichtiger wird dies.
Groupby
print(reviews.groupby('points').points.count())
print(reviews.groupby('points').price.min())
print(reviews.groupby('winery').apply(lambda df: df.title.iloc[0]))
print(reviews.groupby(['country', 'province']).apply(lambda df: df.loc[df.points.idxmax()]))
groupby() teilt die Daten in Gruppen basierend auf einem oder mehreren Kriterien auf. Anschließend können Aggregationsfunktionen auf diese Gruppen angewendet werden.
- Die erste Zeile zählt, wie viele Weine es für jeden Punktwert gibt.
- Die zweite Zeile findet den niedrigsten Preis für jeden Punktwert.
- Die dritte Zeile wählt den ersten Titel für jedes Weingut aus.
- Die letzte Zeile findet für jede Kombination aus Land und Provinz den Wein mit der höchsten Punktzahl.
Agg
print(reviews.groupby(['country']).price.agg([len, min, max]))
agg() ermöglicht die Anwendung mehrerer Aggregationsfunktionen gleichzeitig. Hier wird für jedes Land die Anzahl der Preisangaben sowie der minimale und maximale Preis berechnet.
Multi-Indexing
countries_reviewed = reviews.groupby(['country', 'province']).description.agg([len])
print(countries_reviewed)
mi = countries_reviewed.index
print(type(mi))
print(countries_reviewed.reset_index())
print(countries_reviewed.sort_values(by='len'))
print(countries_reviewed.sort_values(by='len', ascending=False))
print(countries_reviewed.sort_index())
print(countries_reviewed.sort_values(by=['country', 'len']))
Multi-Indexing ermöglicht die Erstellung hierarchischer Indizes. Dies ist nützlich für die Darstellung mehrdimensionaler Daten in einer zweidimensionalen Tabellenstruktur.
Die verschiedenen sort_-Methoden zeigen, wie man nach verschiedenen Kriterien sortieren kann, einschließlich des Indexes selbst oder spezifischer Spalten.
5. Data Types and Missing Values
Bewältigen Sie die häufigsten fortschrittsblockierenden Probleme.
Datentypen
print(reviews.price.dtype)
print(reviews.dtypes)
print(reviews.points.astype('float64'))
print(reviews.index.dtype)
dtype gibt den Datentyp einer Spalte an. Häufige Datentypen in Pandas sind:
object: für Strings (Texte)int64: für ganze Zahlenfloat64: für Dezimalzahlenbool: für boolesche Werte (True/False)datetime64: für Datums- und Zeitangaben
astype() konvertiert eine Spalte in einen anderen Datentyp. Dies ist nützlich, wenn Sie z.B. numerische Operationen auf einer Spalte durchführen möchten, die als Text gespeichert ist.
Fehlende Werte
print(reviews[pd.isnull(reviews.country)])
print(reviews.region_2.fillna("Unknown"))
print(reviews.taster_twitter_handle.replace("@kerinokeefe", "@kerino"))
Fehlende Werte sind in realen Datensätzen häufig und können Analysen beeinträchtigen. Pandas bietet verschiedene Methoden zum Umgang damit:
isnull()identifiziert fehlende Werte.fillna()ersetzt fehlende Werte durch einen spezifizierten Wert.replace()ersetzt spezifische Werte durch andere.
Es ist wichtig, fehlende Werte zu identifizieren und angemessen zu behandeln, um Verzerrungen in der Analyse zu vermeiden.
6. Renaming and Combining
Daten kommen aus vielen Quellen. Helfen Sie allem, zusammen Sinn zu ergeben.
Renaming
reviews.rename(columns={'points': 'score'})
reviews.rename(index={0: 'firstEntry', 1: 'secondEntry'})
reviews.rename_axis("wines", axis='rows').rename_axis("fields", axis='columns')
rename() ermöglicht das Umbenennen von Spalten oder Indexwerten. Dies ist nützlich, um konsistente und aussagekräftige Namen in Ihrem DataFrame zu haben.
rename_axis() benennt die Achsen des DataFrames um. Dies ist besonders nützlich bei MultiIndex-DataFrames.
Combining
canadian_youtube = pd.read_csv("../input/youtube-new/CAvideos.csv")
british_youtube = pd.read_csv("../input/youtube-new/GBvideos.csv")
print(pd.concat([canadian_youtube, british_youtube]))
left = canadian_youtube.set_index(['title', 'trending_date'])
right = british_youtube.set_index(['title', 'trending_date'])
print(left.join(right, lsuffix='_CAN', rsuffix='_UK'))
Das Kombinieren von Datensätzen ist eine häufige Aufgabe in der Datenanalyse. Pandas bietet verschiedene Methoden dafür:
concat()fügt DataFrames entlang einer Achse aneinander. Hier werden die kanadischen und britischen YouTube-Daten vertikal kombiniert.join()verbindet DataFrames basierend auf einem Index. In diesem Beispiel werden die Datensätze anhand von 'title' und 'trending_date' zusammengeführt.
Die Suffixe '_CAN' und '_UK' werden verwendet, um Spalten mit gleichen Namen in den verschiedenen DataFrames zu unterscheiden.
No Comments