Werken met pandas

Werken met pandas

12 maart 2024
Erwin Matijsen
Geplaatst in Tutorial
Onderdeel van Werken met pandas


In een Geautomatiseerd gegevens downloaden heb je geleerd hoe je met requests data kunt ophalen van een URL. In deze tutorial ga je een stapje verder en ga je aan de slag met die data. Je leert werken met het pakket pandas, een veelgebruikte tool voor data-analyse in Python.

Wat is pandas?

pandas is een open-source pakket om data-analyses uit te voeren en data te bewerken. De basis is de zogenaamde DataFrame. Dit is een tabel met rijen en kolommen, vergelijkbaar met een spreadsheet:

DataFrame

Een kolom in pandas is van het gegevenstype Series. De donkergrijze rij bevat de kolomnamen en de donkergrijze eerste kolom bevat de index (rijnummers of namen).

Waarom pandas?

Als je te maken hebt met grote hoeveelheden data in de vorm van CSV-bestanden, Excel-sheets, databases en meer is het prettig om deze data snel en efficiënt te kunnen analyseren en bewerken. Dit is waar pandas goed in is. Met pandas kun je:

  • Data importeren/exporteren in veel verschillende formaten (CSV, Excel, SQL, etc.)
  • Data opschonen (Missende waarden vervangen, kolommen hernoemen, rijen verwijderen, etc.)
  • Data analyseren (groeperen, samenvatten, statistieken berekenen, etc.)

Het grote voordeel van pandas ten opzichte van bijvoorbeeld Excel, is dat het eenvoudiger is om het werken met gegevens te automatiseren. Heb je een Excelbestand waar je eenmalig iets uit nodig hebt, maak dan vooral een draaitabel.

Maar krijg je elke week hetzelfde Excelbestand met nieuwe gegevens, en ben je elke keer die draaitabel opnieuw aan het maken, dan is pandas een uitkomst. Daar komt bij dat het goed in te passen is in een volledig (Python)programma: inlezen van gegevens, opschonen, analyses maken, een rapport maken en dit e-mailen. En dat allemaal automatisch!

Het project

Vervolg op 'Geautomatiseerd gegevens downloaden'

Dit project is een vervolg op Geautomatiseerd gegevens downloaden. Als je dat nog niet hebt gedaan, lees (en maak) dat dan eerst.

In dat project download je data van het KNMI. Dit komt in een txt-bestand. Nadat je het tekstbestand hebt opgeslagen, schoon je het op en sla je het op als CSV-bestand, zodat er eenvoudiger mee is te werken. De data zijn maand- en jaargemiddelde temperaturen van het meetstation De Bilt.

In dit vervolgproject laad je KNMI-gegevens die je in een CSV hebt opgeslagen in met pandas in om er vervolgens een eenvoudige analyses op los te laten. Je kunt verdergaan in het eerdere KNMI-project. Activeer de virtual environment en installeer pandas:

shell
cd projects/knmi
source .venv/bin/activate  # .venv\Scripts\activate.bat voor Windows
python -m pip install pandas
python -m pip freeze > requirements.txt

Aan de slag met pandas

Zodra pandas geïnstalleerd is, kun je het importeren. Het is gebruikelijk om pandas te importeren onder de alias pd. Voeg vervolgens een functie load_data toe aan het project. Dit kan in main.py, maar omdat het project wat uitgebreider wordt kun je het ook in een apart bestand plaatsen. Bijvoorbeeld in data.py. Onder de code lees je de toelichting.

data.py
# ...

import pandas as pd

# ...

CSV = "knmi.csv"
KNMI_COLUMNS = {
    "STN": "Station",
    "JAN": "Januari",
    # ... etc
    "DEC": "December",
    "YYYY": "Jaar",
    "YEAR": "Jaargemiddelde",
}

MONTH_COLUMNS = []
for key, value in KNMI_COLUMNS.items():
    if key not in ["STN", "YYYY", "YEAR"]:
        MONTH_COLUMNS.append(value)

def load_data():
    """Laad de gegevens uit het CSV-bestand in een pandas DataFrame en maak enkele aanpassingen."""

    # Maak een DataFrame van het CSV-bestand
    df = pd.read_csv(CSV, delimiter=",")

    # Hernoem de kolommen
    df.rename(columns=KNMI_COLUMNS, inplace=True)

    # Van 0.1 °C naar 1°C
    columns = MONTH_COLUMNS + ["Jaargemiddelde"]
    updated_columns = df[columns].map(lambda x: x / 10, na_action="ignore")
    df[columns] = updated_columns

    # Toon de eerste 5 rijen voor een snelle inspectie
    print(df.head(), "\n")

    return df

In deze functie laad je de gegevens uit de eerder gemaakte CSV in, hernoem je de kolommen en wijzig je de getallen van 0.1 °C naar 1°C (dus 80.5 wordt 8.5). Tot slot gebruik je df.head() om de DataFrame snel te inspecteren.

CSV inlezen

Met pandas kun je eenvoudig gegevens inlezen uit verschillende soorten bestanden, zoals CSV, Excel, JSON, etc. Voor elk bestandsformaat is er de methode read_*. Dus om het CSV-bestand in te lezen gebruik je pd.read_csv(). Je geeft altijd het pad naar het bestand op (in dit geval opgeslagen in de constante CSV) en optioneel andere argumenten. Omdat de KNMI-gegevens zijn opgeslagen in een CSV waarbij de waarden worden gescheiden door een komma, gebruik je delimiter=",". De gegevens worden ingelezen en opgeslagen in de variabele df, die van het type DataFrame is.

Zie de documentatie van read_csv voor alle opties.

Kolommen hernoemen

De kolomnamen bestaan uit Engelse afkortingen, het is mooier voor het resultaat om te werken met de volledige Nederlandse namen. Gebruik df.rename() om dit te doen. Met het argument columns geef je aan welke kolommen je wilt wijzigen. Je geeft een dict mee met de oude en nieuwe namen als key-value pairs. Met inplace=true geef je aan dat df gewijzigd wordt, in plaats van dat er een nieuwe DataFrame wordt teruggegeven.

Van 0.1 °C naar 1°C

De gegevens in het oorspronkelijke formaat zijn in tienden van graden. Dus een gemiddelde temperatuur van 8 graden, staat genoteerd als 80. Omdat we meer gewend zijn in graden te denken, pas je dit aan. Hiervoor maak je eerst een lijst met alle maandnamen, plus de kolom "Jaargemiddelde". Vervolgens wijzig je alle gegevens in die kolommen. Hiervoor gebruik je de volgende code:

columns = MONTH_COLUMNS + ["Jaargemiddelde"]
updated_columns = df[columns].map(lambda x: x / 10, na_action="ignore")
df[columns] = updated_columns

De syntax om een kolom te selecteren is df["kolomnaam"] voor een enkele kolom, of df[["kolomnaam1", "kolomnaam2"]] voor meerdere kolommen. Met df[columns] selecteer je dus alle kolommen met meetgegevens. Vervolgens pas je de methode .map() toe. Deze methode ontvangt een functie als argument die wordt toegepast op elke cel in de kolommen.

Omdat je alle getallen wilt delen door 10, gebruik je map(lambda x: x / 10). Dit ziet er ingewikkeld uit, maar is hetzelfde als:

def deel_door_10(x):
    return x / 10

df[columns].map(deel_door_10, na_action="ignore")

lambda x: x / 10 is een zogenaamde lambda-functie, ofwel een korte functie zonder het eerst te hoeven definiëren.

Met na_action="ignore" geef je aan dat als een cel geen waarde bevat, de functie wordt overgeslagen (anders krijg je fouten).

Je hebt nu een variabele updated_columns met alle aangepaste kolommen. De laatste stap is om de oude kolommen in df te vervangen door de nieuwe kolommen:

df[columns] = updated_columns

Inspecteren

Tot slot print je de eerste vijf rijen van de DataFrame met df.head(). Dit is handig om snel te kijken hoe je data eruit ziet. Het resultaat ziet er ongeveer zo uit:

Inspecteer een DataFrame met .head()

Een analyse uitvoeren

Je hebt gezien dat je met pandas data kunt inladen en transformeren. Je kunt nu een (eenvoudige) analyse maken, bijvoorbeeld het ophalen van de hoogste jaargemiddelde temperatuur:

data.py
def get_highest_mean_temp(df):
    """
    Haal de hoogste jaargemiddelde temperatuur op.
    """

    # Haal de hoogste jaargemiddelde temperatuur op
    highest_mean_temp = df["Jaargemiddelde"].max()  # Temperatuur in °C
    index = df["Jaargemiddelde"].idxmax()  # Index van de rij met de hoogste temperatuur
    year = df.at[index, "Jaar"]  # Jaar van de hoogste temperatuur

    print(f"Hoogste jaargemiddelde: {highest_mean_temp}°C")
    print(f"Dit was in jaar: {year}")

    return highest_mean_temp, year

Eerst selecteer je de juiste kolom met df["Jaargemiddelde"]. Vervolgens haal je hier het hoogste getal uit op met .max(). Omdat je ook het bijbehorende jaar wilt weten, doe je hetzelfde nog een keer, maar nu met .idmax(). Dit haalt de index op van de rij met het hoogste getal.

Je kunt nu het jaar ophalen met df.at[], waarbij je de zojuist opgehaalde index als eerste waarde opgeeft, en de kolomnaam "Jaar" als tweede waarde. Zo selecteer je de cel uit de rij met de hoogste temperatuur de kolom "Jaar".

Conclusie

pandas is een krachtige tool voor data-analyse in Python. Het biedt veel mogelijkheden waarmee je data kunt importeren, exporteren, opschonen en analyseren. In deze tutorial heb je het topje van de ijsberg gezien van wat mogelijk is. Werk je veel met spreadsheet-achtige gegevens (zoals CSV of Excel), dan is pandas alleen al handig voor het opschonen en transformeren van deze gegevens.

Over de auteur


Erwin Matijsen

Erwin Matijsen

Erwin is de oprichter van python-cursus.nl. In allerlei rollen heeft hij Python ingezet, van het eenvoudiger maken van zijn werk tot het opleveren van complete (web)applicaties. Met vrouw en kinderen woont hij in Havelte (Drenthe), midden in de prachtige natuur. Daar wandelt hij graag, zeker ook omdat de beste ingevingen tijdens een wandeling - weg van de computer - lijken te komen.



Contact

Vragen, opmerkingen?

Heb je vragen, opmerkingen, suggesties of tips naar aanleiding van deze blog? Neem dan contact met ons op, of laat het weten via Mastodon of LinkedIN.