Zurück


Einführung


Aus einem DataFrame und Series einen bestimmten Wert auszusuchen ist ein impliziert schritt in fast jeder Daten Operation.
Daher ist es einer der ersten Dinger die du mit Daten Operationen lernen?

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


Native Zugriffsmethoden


Native Python Objekte zeigen gute Methoden, um Daten zu indexieren. Pandas vereinfacht das um einiges und übertragt alle Native Objekte.
Beachte aber dieses DataFrame:

reviews

country

description

designation

points

price

province

region_1

region_2

taster_name

taster_twitter_handle

title

variety

winery

0

Italy

Aromas include tropical fruit, broom, brimston...

Vulkà Bianco

87

NaN

Sicily & Sardinia

Etna

NaN

Kerin O’Keefe

@kerinokeefe

Nicosia 2013 Vulkà Bianco (Etna)

White Blend

Nicosia

1

Portugal

This is ripe and fruity, a wine that is smooth...

Avidagos

87

15.0

Douro

NaN

NaN

Roger Voss

@vossroger

Quinta dos Avidagos 2011 Avidagos Red (Douro)

Portuguese Red

Quinta dos Avidagos

...

...

...

...

...

...

...

...

...

...

...

...

...

...

129969

France

A dry style of Pinot Gris, this is crisp with ...

NaN

90

32.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Domaine Marcel Deiss 2012 Pinot Gris (Alsace)

Pinot Gris

Domaine Marcel Deiss

129970

France

Big, rich and off-dry, this is powered by inte...

Lieu-dit Harth Cuvée Caroline

90

21.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Domaine Schoffit 2012 Lieu-dit Harth Cuvée Car...

Gewürztraminer

Domaine Schoffit


129971 Zeilen X 13 Spalten

In Python haben wir die Möglichkeit Eigenschaften eines Objekts zugreifen, in dem wir es als ein Attribut zugreifen.
Ein book Objekt hat zum Beispiel die Titel Eigenschaft, auf die können wir zugreifen in dem wir book.title eintippen.
Spalten in Pandas DataFrames funktionieren ziemlich ähnlich.

Daher müssen wir die country eigenschaft von reviews Zugreifen:

reviews.country
0 Italy
1 Portugal
...
129969 France
129970 France

Name: country, Length: 129971, dtype: object


Wenn wir eine Python Dictionary haben, können wir auf die Werte per Indexierung der Operatoren zugreifen.
Das können wir auch mit den Spalten des DataFrame machen.

reviews['country']
0 Italy
1 Portugal
...
129969 France
129970 France

Name: country, Length: 129971, dtype: object


Das sind die Zwei Methoden spezifische Series aus einer DataFrame auszuwählen. Keiner von beiden ist mehr oder weniger
syntaktisch korrekt, beide sind akzeptabel, jedoch hat der Indexierungsoperant [ ] einen Vorteil beim dem die Spalten Namen
mit vorreservierten sind zu ändern (wenn wir ein country prodividence Spalte hätten, würde reviews.country providence nicht Funktionieren).

Sehen die Series von Pandas nicht einem schönerem Dictionary ähnlich? Das ist es so ziemlich auch und wir können auch
einen bestimmten wert mit dem Indexierungsoperanten [] auswählen.

reviews['country'][0]

'Italy'

Indexierung in Pandas


Der Indexierungsoperant und die Attribut Selektion sind gut, weil die perfekt zum Python Ökosystem rein passt.
Zu beginn macht es das verstehen und einsetzten einfach, jedoch hat Pandas auch seine eigenen Zugriffsoperatoren, loc und iloc.
Bei schwierigeren Operationen wirst du diese zwei Zugriffsoperatoren brauchen.

Index-basierte Selektion

Pandas Indexierung funktioniert in zwei Paradigmen. Zuerst die Index-basierte Selektion:
Daten werden laut ihrem numerischen Position erwählt, iloc folgt diesem Paradigma.

Hier wird die erste Reihe des DataFrame ausgesucht und wir verwenden daher:

reviews.iloc[0]

country Italy
description Aromas include tropical fruit, broom, brimston...
...
variety White Blend
winery Nicosia

Name: 0, Length: 13, dtype: object


Sowohl loc als auch iloc zeigen zuerst die Zeilen und dann die Spalte.
Das ist das Gegenteil von wie bereits bekannt in Python (Spalte zuerst und dann die Reihe).

Daher wird es um einiges einfacher Zeilen zu empfangen und um einiges schwerer Spalten zu empfangen, dazu können wir iloc so verwenden:

reviews.iloc[:, 0]

0 Italy
1 Portugal
...
129969 France
129970 France

Name: country, Length: 129971, dtype: object


Wenn man den Doppelpunkt Operanten einzeln setzt, was vom bekannten Python kommt, bedeutet es Alles.
Wenn es aber mit anderen Selektoren genutzt wird kann es die Reichweite an werten andeuten. Also wenn wir zum Beispiel versuchen von country die ersten 3 Zeilen auszugeben müssen wir folgendes eingeben:

reviews.iloc[:3, 0]
0 Italy
1 Portugal
2 US

Name: country, dtype: object


Oder, um nur die zweite und dritte auszuwählen:

reviews.iloc[1:3, 0]
1 Portugal
2 US

Name: country, dtype: object


Es ist auch möglich eine ganze list anzuzeigen:

reviews.iloc[[0, 1, 2], 0]
0 Italy
1 Portugal
2 US

Name: country, dtype: object


Letztendlich ist es auch noch wichtig zu wissen das Negative Zahlen hier auch einen Platz haben.
Wie schon vom Python Kurs bekannt, zählen Negative Zahlen von der Ende der list oder in diesem Fall des Datensets. Also die letzten 5 würde man so eingeben:

reviews.iloc[-5:]

country

description

designation

points

price

province

region_1

region_2

taster_name

taster_twitter_handle

title

variety

winery

129966

Germany

Notes of honeysuckle and cantaloupe sweeten th...

Brauneberger Juffer-Sonnenuhr Spätlese

90

28.0

Mosel

NaN

NaN

Anna Lee C. Iijima

NaN

Dr. H. Thanisch (Erben Müller-Burggraef) 2013 ...

Riesling

Dr. H. Thanisch (Erben Müller-Burggraef)

129967

US

Citation is given as much as a decade of bottl...

NaN

90

75.0

Oregon

Oregon

Oregon Other

Paul Gregutt

@paulgwine

Citation 2004 Pinot Noir (Oregon)

Pinot Noir

Citation

129968

France

Well-drained gravel soil gives this wine its c...

Kritt

90

30.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Domaine Gresser 2013 Kritt Gewurztraminer (Als...

Gewürztraminer

Domaine Gresser

129969

France

A dry style of Pinot Gris, this is crisp with ...

NaN

90

32.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Domaine Marcel Deiss 2012 Pinot Gris (Alsace)

Pinot Gris

Domaine Marcel Deiss

129970

France

Big, rich and off-dry, this is powered by inte...

Lieu-dit Harth Cuvée Caroline

90

21.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Domaine Schoffit 2012 Lieu-dit Harth Cuvée Car...

Gewürztraminer

Domaine Schoffit

Label-basierte Selektion


Das zweite Paradigma für die Attribut Selektion ist der loc Operant: Label-basierte Selektion.
Hier ist der Daten Index wert wichtig und nicht die Position.

Wenn wir zum Beispiel probieren den ersten eintrag von reviews zu empfangen müssen wir das eintippen:

reviews.loc[0, 'country']
'Italy'


Iloc ist im Konzept einfacher als loc weil es die Indizes des Datasets ignoriert.
Wenn wir iloc einsetzen behandeln wir das Dataset wir eine große matrix (Liste einer Liste), eine wo wir per Position indexieren.
loc nutzt die Information in den Indizes um seine Arbeit zu machen, weil Datasets Normalerweise bedeutungsvolle Indizes haben ist es einfacher loc zu verwenden.
Hier ist ein Beispiel zu einer Operation die viel einfacher mit loc ist:

reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]

taster_name

taster_twitter_handle

points

0

Kerin O’Keefe

@kerinokeefe

87

1

Roger Voss

@vossroger

87

...

...

...

...

129969

Roger Voss

@vossroger

90

129970

Roger Voss

@vossroger

90


129971 Zeilen x 3 Spalten

Zwischen loc und iloc wählen

Wenn man sich entscheidet zwischen loc und iloc gibt es meistens diese "ich habs" worauf man achten sollten und das ist die Unterschiede beim Indexierungsschema.
Iloc verwendet das Python stdlib Indexierungsschema, wo das erste Element der Reichweite inkludiert ist und das letzte exkludiert.
Also 0: 10 werden die Einträge 0, . . . . . 9 beachtet, während loc inklusiv ist und auch den zehnten Eintrag beinhaltet.
Wieso ist das anders? loc kann alle stdlib typen indexieren: strings, zum Beispiel. Wenn wir ein DataFrame mit dem
Index wert Apfel, …, Kartoffel, …, und wir wollen "alle Alphabetische gereihte Früchte Zwischen Apfel und Kartoffel wisse",
dann ist es um einiges entspannter index df.loc['Apfel':'Kartoffel'] statt sowas zu indexieren df.loc['Apfel', 'Kartoffem'] (m kommt nach dem l im Alphabet.

Das wird besonders verwirrend, wenn das DataFrame index eine einfache nummern liste, hier zum Beispiel 0 bis 1000 ist. In diesem fall wird df.iloc[0:1000] 1000 Einträge returnieren,
während df.loc[0:1000] 1001 returnieren wird! Um die 1000 Element mit loc zu kriegen musst du statt 1000, 999 eintippen, also df.loc[0:999].

Sonst bleibt die Semantik für loc und iloc gleich.

Den Index Manipulieren

Label-basierte Selektion kommt von der Kraft der Label in den index. Kritisch gesehen ist der index der hier verwendet wird nicht unveränderlich,
also können wir den index je nach Bedarf manipulieren.
Der set_index() Methode kann hier die ganze Arbeit übernehmen. Das passiert, wenn wir set_index zum title Feld machen:

reviews.set_index("title")
 

country

description

designation

points

price

province

region_1

region_2

taster_name

taster_twitter_handle

variety

winery

title

Nicosia 2013 Vulkà Bianco (Etna)

Italy

Aromas include tropical fruit, broom, brimston...

Vulkà Bianco

87

NaN

Sicily & Sardinia

Etna

NaN

Kerin O’Keefe

@kerinokeefe

White Blend

Nicosia

Quinta dos Avidagos 2011 Avidagos Red (Douro)

Portugal

This is ripe and fruity, a wine that is smooth...

Avidagos

87

15.0

Douro

NaN

NaN

Roger Voss

@vossroger

Portuguese Red

Quinta dos Avidagos

...

...

...

...

...

...

...

...

...

...

...

...

...

Domaine Marcel Deiss 2012 Pinot Gris (Alsace)

France

A dry style of Pinot Gris, this is crisp with ...

NaN

90

32.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Pinot Gris

Domaine Marcel Deiss

Domaine Schoffit 2012 Lieu-dit Harth Cuvée Caroline Gewurztraminer (Alsace)

France

Big, rich and off-dry, this is powered by inte...

Lieu-dit Harth Cuvée Caroline

90

21.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Gewürztraminer

Domaine Schoffit


129971 Zeilen x 13 Spalten

Das ist sehr nützlich, wenn dir ein besser index für das Dataset als das derzeitige einfällt.

Konditionelle Selektion


Bis jetzt haben wir verschiedene Schritte genutzt um Daten zu indexieren in dem wir die eigenschaften des DataFrames an sich verwenden.
Um Interessante Sachen mit den Daten zu machen, müssen wir aber öfters Fragen stellen die auf Konditionen basieren.
Wenn wir besonders interessiert sind in überdurchschnittlichen Wein der spezifisch von Italien kommt, dann starten wir in dem zuerst prüfen ob der Wein von Italien ist oder nicht:

reviews.country == 'Italy'
0 True
1 False
...
129969 False
129970 False

Name: country, Length: 129971, dtype: bool


Diese Operation produziert eine Series aus True und False Boole die je nach Staat angeordnet sind.
Dieses Ergebnis kann dann innerhalb von loc verwendet werden um die relevante Information zu ergattern.

reviews.loc[reviews.country == 'Italy']

country

description

designation

points

price

province

region_1

region_2

taster_name

taster_twitter_handle

title

variety

winery

0

Italy

Aromas include tropical fruit, broom, brimston...

Vulkà Bianco

87

NaN

Sicily & Sardinia

Etna

NaN

Kerin O’Keefe

@kerinokeefe

Nicosia 2013 Vulkà Bianco (Etna)

White Blend

Nicosia

6

Italy

Here's a bright, informal red that opens with ...

Belsito

87

16.0

Sicily & Sardinia

Vittoria

NaN

Kerin O’Keefe

@kerinokeefe

Terre di Giurfo 2013 Belsito Frappato (Vittoria)

Frappato

Terre di Giurfo

...

...

...

...

...

...

...

...

...

...

...

...

...

...

129961

Italy

Intense aromas of wild cherry, baking spice, t...

NaN

90

30.0

Sicily & Sardinia

Sicilia

NaN

Kerin O’Keefe

@kerinokeefe

COS 2013 Frappato (Sicilia)

Frappato

COS

129962

Italy

Blackberry, cassis, grilled herb and toasted a...

Sàgana Tenuta San Giacomo

90

40.0

Sicily & Sardinia

Sicilia

NaN

Kerin O’Keefe

@kerinokeefe

Cusumano 2012 Sàgana Tenuta San Giacomo Nero d...

Nero d'Avola

Cusumano


19540 Zeilen x 13 Spalten

Dieses DataFrame hat zirka 20.000 Zeilen und Originalerweise hatte es zirka 130.000. Das bedeutet das ungefähr 15% des Weins von Italien herkommt.
Wir wollten aber auch wissen welche über dem durchschnitt waren, die Weine werden auf einer Skala von 80 bis 100 bewertet.
Daher wird nur wein der mindestens eine Bewertung von 90 hat angezeigt.
Wir können das Kaufmännische und verwenden, um die Zwei fragen zusammen zu binden:

reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)]

country

description

designation

points

price

province

region_1

region_2

taster_name

taster_twitter_handle

title

variety

winery

120

Italy

Slightly backward, particularly given the vint...

Bricco Rocche Prapó

92

70.0

Piedmont

Barolo

NaN

NaN

NaN

Ceretto 2003 Bricco Rocche Prapó (Barolo)

Nebbiolo

Ceretto

130

Italy

At the first it was quite muted and subdued, b...

Bricco Rocche Brunate

91

70.0

Piedmont

Barolo

NaN

NaN

NaN

Ceretto 2003 Bricco Rocche Brunate (Barolo)

Nebbiolo

Ceretto

...

...

...

...

...

...

...

...

...

...

...

...

...

...

129961

Italy

Intense aromas of wild cherry, baking spice, t...

NaN

90

30.0

Sicily & Sardinia

Sicilia

NaN

Kerin O’Keefe

@kerinokeefe

COS 2013 Frappato (Sicilia)

Frappato

COS

129962

Italy

Blackberry, cassis, grilled herb and toasted a...

Sàgana Tenuta San Giacomo

90

40.0

Sicily & Sardinia

Sicilia

NaN

Kerin O’Keefe

@kerinokeefe

Cusumano 2012 Sàgana Tenuta San Giacomo Nero d...

Nero d'Avola

Cusumano


6648 Zeilen x 13 Spalten

Wenn wir egal welchen Wein von Italien kaufen oder es ist über dem Durschnitt. Für so eine Abfrage brauchen wir eine pipe (|):

reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)]

country

description

designation

points

price

province

region_1

region_2

taster_name

taster_twitter_handle

title

variety

winery

0

Italy

Aromas include tropical fruit, broom, brimston...

Vulkà Bianco

87

NaN

Sicily & Sardinia

Etna

NaN

Kerin O’Keefe

@kerinokeefe

Nicosia 2013 Vulkà Bianco (Etna)

White Blend

Nicosia

6

Italy

Here's a bright, informal red that opens with ...

Belsito

87

16.0

Sicily & Sardinia

Vittoria

NaN

Kerin O’Keefe

@kerinokeefe

Terre di Giurfo 2013 Belsito Frappato (Vittoria)

Frappato

Terre di Giurfo

...

...

...

...

...

...

...

...

...

...

...

...

...

...

129969

France

A dry style of Pinot Gris, this is crisp with ...

NaN

90

32.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Domaine Marcel Deiss 2012 Pinot Gris (Alsace)

Pinot Gris

Domaine Marcel Deiss

129970

France

Big, rich and off-dry, this is powered by inte...

Lieu-dit Harth Cuvée Caroline

90

21.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Domaine Schoffit 2012 Lieu-dit Harth Cuvée Car...

Gewürztraminer

Domaine Schoffit


61937 Zeile x 13 Spalten

Pandas hat ein paar schon eingebauten Konditionelle selektoren, zwei von denen werden hier gleich vorgezeigt.
Der erste ist isin. Isin erlaubt erlaubt dir die werte die "is in" der Liste der werte verfügbar ist.
Hier wählen wir entweder Wein nur von Italien oder Frankreich zum Beispiel:

reviews.loc[reviews.country.isin(['Italy', 'France'])]

country

description

designation

points

price

province

region_1

region_2

taster_name

taster_twitter_handle

title

variety

winery

0

Italy

Aromas include tropical fruit, broom, brimston...

Vulkà Bianco

87

NaN

Sicily & Sardinia

Etna

NaN

Kerin O’Keefe

@kerinokeefe

Nicosia 2013 Vulkà Bianco (Etna)

White Blend

Nicosia

6

Italy

Here's a bright, informal red that opens with ...

Belsito

87

16.0

Sicily & Sardinia

Vittoria

NaN

Kerin O’Keefe

@kerinokeefe

Terre di Giurfo 2013 Belsito Frappato (Vittoria)

Frappato

Terre di Giurfo

...

...

...

...

...

...

...

...

...

...

...

...

...

...

129969

France

A dry style of Pinot Gris, this is crisp with ...

NaN

90

32.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Domaine Marcel Deiss 2012 Pinot Gris (Alsace)

Pinot Gris

Domaine Marcel Deiss

129970

France

Big, rich and off-dry, this is powered by inte...

Lieu-dit Harth Cuvée Caroline

90

21.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Domaine Schoffit 2012 Lieu-dit Harth Cuvée Car...

Gewürztraminer

Domaine Schoffit


41633 Zeilen x 13 Spalten

Der zweite ist isnull (und dessen Kompanie notnull). Diese Methoden erlauben dir bestimmte werte auszusuchen die nicht existieren
oder die leer sind. Es könnte zum Beispiel den Wein mit fehlenden Preisen nicht empfangen:

reviews.loc[reviews.price.notnull()]

country

description

designation

points

price

province

region_1

region_2

taster_name

taster_twitter_handle

title

variety

winery

1

Portugal

This is ripe and fruity, a wine that is smooth...

Avidagos

87

15.0

Douro

NaN

NaN

Roger Voss

@vossroger

Quinta dos Avidagos 2011 Avidagos Red (Douro)

Portuguese Red

Quinta dos Avidagos

2

US

Tart and snappy, the flavors of lime flesh and...

NaN

87

14.0

Oregon

Willamette Valley

Willamette Valley

Paul Gregutt

@paulgwine

Rainstorm 2013 Pinot Gris (Willamette Valley)

Pinot Gris

Rainstorm

...

...

...

...

...

...

...

...

...

...

...

...

...

...

129969

France

A dry style of Pinot Gris, this is crisp with ...

NaN

90

32.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Domaine Marcel Deiss 2012 Pinot Gris (Alsace)

Pinot Gris

Domaine Marcel Deiss

129970

France

Big, rich and off-dry, this is powered by inte...

Lieu-dit Harth Cuvée Caroline

90

21.0

Alsace

Alsace

NaN

Roger Voss

@vossroger

Domaine Schoffit 2012 Lieu-dit Harth Cuvée Car...

Gewürztraminer

Domaine Schoffit


120975 Zeilen x 13 Spalten

Werte einsetzen


Wenn wir in die andere Richtung gehen, finden wir heraus das Werte in DataFrame's einsetzen einfach ist. Man kann entweder einen konstant wert einsetzen:

reviews['critic'] = 'everyone'
reviews['critic']
0 everyone
1 everyone
...
129969 everyone
129970 everyone

Name: critic, Length: 129971, dtype: object


oder mit änderbaren Werten:

reviews['index_backwards'] = range(len(reviews), 0, -1)
reviews['index_backwards']
0 129971
1 129970
...
129969 2
129970 1

Name: index_backwards, Length: 129971, dtype: int64