Zurück


Einführung


Letztes Mal haben wir gelernt, wie wir relevante Daten aus unseren DataFrame oder Series auswählen.

Jedoch kommen die Daten nicht immer richtig raus und wir müssen unseren Befehl ein wenig neu formatieren für unsere derzeitige Aufgabe.
In dieser Übung werden wir unterschiedliche Wege anschauen den Input genau richtig zu erschaffen.

Hierfür werden wir die Wein Magazin Daten verwenden.

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


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

Zusammenfassungsfunktionen

Pandas hat viele einfache "Zusammenfassungsfunktionen" (nicht der offizielle Name) die,
die Daten mit Leichtigkeit neuformatieren können. Verwenden wir mal die describe() Methode:

reviews.points.describe()

count 129971.000000
mean 88.447138
...
75% 91.000000
max 100.000000

Name: points, Length: 8, dtype: float64


Diese Methode generiert eine summe der Attribute aus der ausgewählten Spalte. Es ist "type-aware",
also passt es den Output der Daten je nach dem Datentyp des Inputs an. Der obere Output macht nur sinn für Numerische Daten,
wenn wir String Daten wollten würde wir das erhalten:

reviews.taster_name.describe()

count 103727
unique 19
top Roger Voss
freq 25514

Name: taster_name, dtype: object


Wenn du eine bestimmte summen Statistik einer Spalte in eine DataFrame oder eine Series willst,
dann kann dir die mean() Funktion weiter helfen (hier zum Beispiel für die durchschnittliche Statistik der Bewertung)

reviews.points.mean()

88.44713820775404


Um eine Einzigartige Liste von werten zu sehen müssen wir die unique() Funktion verwenden:

reviews.taster_name.unique()

array(['Kerin O’Keefe', 'Roger Voss', 'Paul Gregutt',
'Alexander Peartree', 'Michael Schachner', 'Anna Lee C. Iijima',
'Virginie Boone', 'Matt Kettmann', nan, 'Sean P. Sullivan',
'Jim Gordon', 'Joe Czerwinski', 'Anne Krebiehl\xa0MW',
'Lauren Buzzeo', 'Mike DeSimone', 'Jeff Jenssen',
'Susan Kostrzewa', 'Carrie Dykes', 'Fiona Adams',
'Christina Pickard'], dtype=object)
Um eine Liste aus Einzelartige Werten zu sehen, wo steht wie oft sie im Dataset vorkommen,
können wir die value_counts() Methode verwenden:

reviews.taster_name.value_counts()

Roger Voss 25514
Michael Schachner 15134
...
Fiona Adams 27
Christina Pickard 6

Name: taster_name, Length: 19, dtype: int64

Maps

Eine map ist ein Terminus, der von der Mathematik geborgt wird.
Hierbei setzt eine Funktion eine gruppe von Werten und platziert es ("maps") in eine andere gruppe von Werten.
In der Datenwissenschaft wollen wir öfters neue Visualisierung von bereits existierenden Daten, hierfür verwenden wir meistens maps.

Wir verwenden hauptsächlich nur zwei mapping methoden.
map() ist die erste und ein wenig einfachere Methode.
Wenn wir zum Beispiel die werte vom mean() wieder mit mean() auf 0 ändern möchten wollen, dann könnten wir das so machen:

review_points_mean = reviews.points.mean()
reviews.points.map(lambda p: p - review_points_mean)

0 -1.447138
1 -1.447138
...
129969 1.552862
129970 1.552862

Name: points, Length: 129971, dtype: float64


Die Funktion die du zu map() passt sollte einen einzelnen wert von der Series erwarten (in unserem Beispiel war der erwartete wert ein punkte wert.)
und eine transformierte Version von diesem Wert ausgeben. map() spuckt dir eine neue Series aus, wo all die werte nach deiner Funktion umgeändert wurden.

apply() ist die zweite Methode die wir für die gesamte Transformation des DataFrames verwenden.
Das wird mit einer selbst gemacht Methode gemacht die, die einzelnen Zeilen aufruft.

def remean_points(row):
row.points = row.points - review_points_mean
return row

reviews.apply(remean_points, axis='columns')

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

-1.447138

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

-1.447138

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

1.552862

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

1.552862

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

Wenn wir stattdessen reviews.apply() mit der axis='index' aufgerufen,
dann müssten wir nicht eine Funktion aufrufen die jede Zeile aufruft sondern eine die jede Spalte aufruft für die transformation.
Zu merken ist, dass map() und apply() neue, transformierte Series und DataFrames zurück geben.
Sie modifizieren nicht die originellen Daten auf denen sie aufgerufen wurden.
Wenn wir uns die erste Zeile von reviews anschauen sehen wir, das noch die originellen punkte zu sehen sind.

reviews.head(1)

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


Pandas versorgt uns mit vielen bekannten mapping Methoden als built-ins. Hier ist ein schnellerer weg unsere punkte mit mean() um zu ändern.

review_points_mean = reviews.points.mean()
reviews.points - review_points_mean

0 -1.447138
1 -1.447138
...
129969 1.552862
129970 1.552862

Name: points, Length: 129971, dtype: float64


In diesem Code werden viele Operationen zwischen den linken werten (alles was in der Series ist)
und einer einzelnen rechten wert (der mean() wert) gearbeitet. Pandas schaut nach,
was wir "meanen" müssen um diesen Wert dann mit dem Mean Wert von jedem Wert des Datasets zu subtrahieren.

Pandas wird verstehen was gemacht werden muss, wenn wir diese Operation über mehrere Series mit gleicher Länge ausführen.
Hier haben wir Beispielsweise einen einfachen weg Staat und Region im Dataset zu verbinden:

reviews.country + " - " + reviews.region_1

0 Italy - Etna
1 NaN
...
129969 France - Alsace
129970 France - Alsace

Length: 129971, dtype: object


Diese Operatoren sind schneller als map() oder apply(), weil es speed ups die in Pandas eingebaut sind anwendet.
Alle Standard Operanten von Python (>,<,==, usw.) funktionieren auf dieser Art und Weise.
Es ist aber nicht so flexibel wie map() oder apply(), es kann auch mehr fortgeschrittene konditionelle Logik verwenden,
die nicht so mit Addition und Subtraktion gemacht werden können.