Beispiel#

Üblicherweise werden zunächst die erforderlichen Bibliotheken importiert:

[1]:
import pandas as pd
import matplotlib.pyplot as plt

Beispieldaten einlesen#

Anschließend lesen wir die csv-Daten in Pandas als DataFrame ein:

[2]:
df = pd.read_csv('https://s3.amazonaws.com/dq-blog-files/fortune500.csv')

Daten untersuchen#

pandas.DataFrame.head gibt die ersten Zeilen für das Objekt basierend auf der Position zurück.

[3]:
df.head()
[3]:
Year Rank Company Revenue (in millions) Profit (in millions)
0 1955 1 General Motors 9823.5 806
1 1955 2 Exxon Mobil 5661.4 584.8
2 1955 3 U.S. Steel 3250.4 195.4
3 1955 4 General Electric 2959.1 212.6
4 1955 5 Esmark 2510.8 19.1

pandas.DataFrame.tail gibt die letzten Zeilen des Objekts basierend auf der Position zurück.

[4]:
df.tail()
[4]:
Year Rank Company Revenue (in millions) Profit (in millions)
25495 2005 496 Wm. Wrigley Jr. 3648.6 493
25496 2005 497 Peabody Energy 3631.6 175.4
25497 2005 498 Wendy's International 3630.4 57.8
25498 2005 499 Kindred Healthcare 3616.6 70.6
25499 2005 500 Cincinnati Financial 3614.0 584

Umbenennen der Spalten#

Die Spalten können mit pandas.DataFrame.columns umbenannt werden. Dadurch können wir später leichter auf die Spalten verweisen. Anschließend überprüfen wir die Änderung mit df.head():

[5]:
df.columns = ['year', 'rank', 'company', 'revenue', 'profit']
df.head()
[5]:
year rank company revenue profit
0 1955 1 General Motors 9823.5 806
1 1955 2 Exxon Mobil 5661.4 584.8
2 1955 3 U.S. Steel 3250.4 195.4
3 1955 4 General Electric 2959.1 212.6
4 1955 5 Esmark 2510.8 19.1

Überprüfen der Anzahl der Datensätze#

len gibt die Anzahl der Elemente eines Objekts zurück.

[6]:
len(df)
[6]:
25500

Das entspricht 500 Zeilen pro Jahr von 1955 bis einschließlich 2005.

Überprüfen der Datentypen#

pandas.dataframe.dtypes gibt die Datentypen im DataFrame zurück.

[7]:
df.dtypes
[7]:
year         int64
rank         int64
company     object
revenue    float64
profit      object
dtype: object

Die Spalte profit sollte vom Datentyp float64 sein; das ist hier nicht der Fall. Dies weist darauf hin, dass die Spalte wahrscheinlich einige Werte enthält, die keine Zahlen sind. Überprüfen wir dies mit einem regulären Ausdruck:

[8]:
non_numeric_profits = df.profit.str.contains('[^0-9.-]')

df.loc[non_numeric_profits].head()
[8]:
year rank company revenue profit
228 1955 229 Norton 135.0 N.A.
290 1955 291 Schlitz Brewing 100.0 N.A.
294 1955 295 Pacific Vegetable Oil 97.9 N.A.
296 1955 297 Liebmann Breweries 96.0 N.A.
352 1955 353 Minneapolis-Moline 77.4 N.A.

Ob es neben N.A. noch andere nichtnumerische Werte gibt, überprüfen wir mit

[9]:
set(df.profit[non_numeric_profits])
[9]:
{'N.A.'}

Als nächstes untersuchen wir, wie viele Datensätze davon betroffen sind:

[10]:
len(df.profit[non_numeric_profits])
[10]:
369

… und wie sie sich über die Jahre verteilen:

[11]:
bin_sizes, _, _ = plt.hist(df.year[non_numeric_profits], bins=range(1955, 2006))
../_images/first-steps_example_23_0.png

Hier können wir sehen, dass die problematischen Datenpunkte in einem Jahr 24 nicht überschreiten und bei 500 Datenpunkte pro Jahr würde das Entfernen dieser Werte weniger als 5% der Daten für dieses Jahr ausmachen. Nehmen wir an, dass es für uns akzeptabel ist, dass die problematischen Daten entfernt werden können:

[12]:
df = df.loc[~non_numeric_profits]
df.profit = df.profit.apply(pd.to_numeric)

Wir sollten nun 25500 - 369 Datensätze haben:

[13]:
len(df)
[13]:
25131

… und für die Spalte profit sollte der Datentyp nun float64 sein:

[14]:
df.dtypes
[14]:
year         int64
rank         int64
company     object
revenue    float64
profit     float64
dtype: object