Zurück


Einführung


Maps erlaubt uns die Daten in DataFrames oder Serien einzeln für eine ganze spalte zu ändern.
Jedoch wollen wir manchmal unsere Daten gruppieren und dann etwas spezifisches mit der Gruppe machen wo wir dann unsere Daten gepackt haben.
Das können wir mit der groupby() Operation machen.
Im laufe dieser Einheit werden wir auch noch lernen wie man DataFrames komplex indexiert und wie man daten sortiert.

Gruppenweise Analyse

Eine Funktion die wir bis jetzt sehr oft verwendet haben ist die value_counts() Funktion.
Wir können value_counts() auf diese Weise imitieren:

Aufklappen
import pandas as pd
reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)
pd.set_option("display.max_rows", 5)


reviews.groupby('points').points.count()

points
80 397
81 692
...
99 33
100 19
Name: points, Length: 21, dtype: int64


Groupby() erstellt eine gruppe von reviews die, die selbe Punktzahl Werte von wein besitzt.
Dann haben wir von jeden einzelnen dieser Gruppen die points() Spalte genommen und gezählt wie oft es vorkommt.
value_counts() ist nur eine Abkürzung dieser groupby() Operation.
Wir können auf diese neu erstellten daten jetzt die gleichen Zusammenfassungsfunktionen wie vorhin verwenden.
Wenn wir den billigsten Wein jeder point value Kategorie wollen dann müssen wir folgendes eingeben:

reviews.groupby('points').price.min()

points
80 5.0
81 5.0
...
99 44.0
100 80.0

Name: price, Length: 21, dtype: float64


Du kannst dir jede gebildete Gruppe wie ein Ausschnitt unseres DataFrames vorstellen,
diese hat nur Daten die zu dem gesuchten Befehl passen.
Wir können direkt auf diese DataFrame mit der apply Methode zugreifen und dann können wir die Daten wie gewollt manipulieren.
Zum Beispiel, hier wird das erste wein jeder Brauerei in unser Dataset ausgewählt:

reviews.groupby('winery').apply(lambda df: df.title.iloc[0])

winery

1+1=3 1+1=3 NV Rosé Sparkling (Cava)
10 Knots 10 Knots 2010 Viognier (Paso Robles)
...
àMaurice àMaurice 2013 Fred Estate Syrah (Walla Walla V...
Štoka Štoka 2009 Izbrani Teran (Kras)

Length: 16757, dtype: object


Wir können sogar spezifischer gruppieren, also in mehr als eine Spalte gruppieren.
Hier siehst du wie wir aus jedem Staat und aus jeder Provinz den besten Wein wählen:

reviews.groupby(['country', 'province']).apply(lambda df: df.loc[df.points.idxmax()])

country

description

designation

points

price

province

region_1

region_2

taster_name

taster_twitter_handle

title

variety

winery

country

province

Argentina

Mendoza Province

Argentina

If the color doesn't tell the full story, the ...

Nicasia Vineyard

97

120.0

Mendoza Province

Mendoza

NaN

Michael Schachner

@wineschach

Bodega Catena Zapata 2006 Nicasia Vineyard Mal...

Malbec

Bodega Catena Zapata

Other

Argentina

Take note, this could be the best wine Colomé ...

Reserva

95

90.0

Other

Salta

NaN

Michael Schachner

@wineschach

Colomé 2010 Reserva Malbec (Salta)

Malbec

Colomé

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

Uruguay

San Jose

Uruguay

Baked, sweet, heavy aromas turn earthy with ti...

El Preciado Gran Reserva

87

50.0

San Jose

NaN

NaN

Michael Schachner

@wineschach

Castillo Viejo 2005 El Preciado Gran Reserva R...

Red Blend

Castillo Viejo

Uruguay

Uruguay

Cherry and berry aromas are ripe, healthy and ...

Blend 002 Limited Edition

91

22.0

Uruguay

NaN

NaN

Michael Schachner

@wineschach

Narbona NV Blend 002 Limited Edition Tannat-Ca...

Tannat-Cabernet Franc

Narbona


425 Zeilen x 13 Spalten

Ein weiteres groupby das wichtig wird ist das agg(),
es erlaubt dir ein Haufen von verschiedenen Funktionen auf deinem DataFrame gleichzeitig laufen zu lassen.
Hier generieren wir eine einfache statistische Summe des Datasets.

reviews.groupby(['country']).price.agg([len, min, max])

len

min

max

country

Argentina

3800

4.0

230.0

Armenia

2

14.0

15.0

...

...

...

...

Ukraine

14

6.0

13.0

Uruguay

109

10.0

130.0


43 Zeilen x 3 Spalten

Wenn groupby() gut eingesetzt wird kannst du eine menge an mächtigen Sachen mit deinem Dataset machen.

Multiindex

In allen Beispielen bis jetzt haben wir mit DataFrames oder Series gearbeitet, dessen Objects nur ein ein-label index sind.
groupby() ist ein wenig anders, denn manche Operationen geben uns einen sogenannten Multiindex.
Der Multiindex ist anders vom normalen Index, da er über mehrere Werte verfügt.

countries_reviewed = reviews.groupby(['country', 'province']).description.agg([len]) countries_reviewed

len

country

province

Argentina

Mendoza Province

3264

Other

536

...

...

...

Uruguay

San Jose

3

Uruguay

24


425 Zeilen x 1 Spalte

mi = countries_reviewed.index
type(mi)

pandas.core.indexes.multi.MultiIndex


Multiindizes haben viele Methoden die sich um das hierarchische System kümmern, welches bei ein-stufigen Indizes nicht vorkommt.
Man braucht auch zwei verschiedene Stufen der Labels um einen wert zu erhalten.
Für neue Nutzer von Pandas gibt es öfters diese "Aha" Momente, vor allem bei Multiindexen.

Wir weisen Sie zu dieser Dokumentation von Pandas wo der MultiIndex / Advanced Selection genauer beschrieben wird.
Jedoch wird die häufigste Multiindex Methode die du verwenden wirst es wieder zu einem normalen Index konvertieren,
hier reden wir von der reset_index() Methode:

countries_reviewed.reset_index()

country

province

len

0

Argentina

Mendoza Province

3264

1

Argentina

Other

536

...

...

...

...

423

Uruguay

San Jose

3

424

Uruguay

Uruguay

24


425 Zeilen x 3 Spalten

Sortierung

Wenn wir kurz wieder auf countries_reviewed schauen,
sehen wir das es uns die Daten nach der Index Reihenfolge sortiert und nicht nach der Wert Reihenfolge.
Naja das sehen wir auch beim ergebnis von groupby(),
es sortiert ebenfalls die Spalten nach dem Wert des Index und nicht nach dem Wert.

Aber wir können es nach dem was wir wollen mit sort_values sortieren.

countries_reviewed = countries_reviewed.reset_index() countries_reviewed.sort_values(by='len')

country

province

len

179

Greece

Muscat of Kefallonian

1

192

Greece

Sterea Ellada

1

...

...

...

...

415

US

Washington

8639

392

US

California

36247


425 Zeilen x 3 Spalten

Sort_values() sortiert standartweise aufsteigenden, daher sind die niedrigsten Werte zu erst zu sehen.
Jedoch wollen wir es vielleicht herabsteigend sortiert, dann müssen wir es so einstellen:

countries_reviewed.sort_values(by='len', ascending=False)
 

country

province

len

392

US

California

36247

415

US

Washington

8639

...

...

...

...

63

Chile

Coelemu

1

149

Greece

Beotia

1


425 Zeilen x 3 Spalten

Wenn wir nach Index werten sortieren wollen dann sollten wir die verwandte Methode sort_index() verwenden.
Diese Methode hat die gleichen Argumente und Standardsortierung.

countries_reviewed.sort_index()

country

province

len

0

Argentina

Mendoza Province

3264

1

Argentina

Other

536

...

...

...

...

423

Uruguay

San Jose

3

424

Uruguay

Uruguay

24

425 Zeilen x 3 Spalten

Zu allerletzt, zeigen wir dir noch wie man mehr als eine Spalte gleichzeitig sortiert.

countries_reviewed.sort_values(by=['country', 'len'])

country

province

len

1

Argentina

Other

536

0

Argentina

Mendoza Province

3264

...

...

...

...

424

Uruguay

Uruguay

24

419

Uruguay

Canelones

43


425 Zeilen x 3 Spalten