Python dataanalys med Pandas: Från CSV till insikter
Ladda, transformera och analysera data med Pandas. Groupby, merge, tidsserier och visualisering — med riktiga dataset och konkreta exempel.
Pandas är det verktyg som gör Python till ett seriöst alternativ för dataanalys. Det ger dig kraftfulla datastrukturer för att ladda, transformera och analysera data med några rader kod. Vare sig du arbetar med CSV-filer, databaser eller API-data — Pandas hanterar det.
Den här guiden tar dig från att ladda en CSV till att producera meningsfulla insikter. Med riktiga kodexempel, inte abstrakta förklaringar.
Ladda och inspektera data
Allt börjar med att ladda data. Pandas kan läsa CSV, Excel, JSON, SQL och en mängd andra format. read_csv är den vanligaste startpunkten.
import pandas as pd
# Ladda CSV-fil
df = pd.read_csv("forsaljning.csv")
# Första överblicken
print(df.shape) # (1500, 8) — 1500 rader, 8 kolumner
print(df.head()) # Första 5 raderna
print(df.dtypes) # Datatyper per kolumn
print(df.describe()) # Statistisk sammanfattning
# Output av describe():
# pris antal
# count 1500.00 1500.00
# mean 349.50 12.30
# std 180.20 8.45
# min 29.00 1.00
# max 999.00 50.00
# Kolla efter saknade värden
print(df.isnull().sum())
# produkt 0
# kategori 3
# pris 0
# datum 0
# stad 12Filtrera och transformera
Pandas styrka ligger i hur enkelt du kan filtrera, sortera och omforma data. Booleska masker och query() gör filtrering intuitivt.
# Filtrera med boolesk mask
dyra_produkter = df[df["pris"] > 500]
# Flera villkor (& för AND, | för OR)
stockholm_dyra = df[
(df["stad"] == "Stockholm") &
(df["pris"] > 300)
]
# query() — mer läsbart för komplexa filter
resultat = df.query(
'stad == "Göteborg" and kategori == "Elektronik" and pris < 1000'
)
# Skapa nya kolumner
df["total"] = df["pris"] * df["antal"]
df["prisgrupp"] = pd.cut(
df["pris"],
bins=[0, 100, 300, 500, 1000],
labels=["Budget", "Mellan", "Premium", "Lyx"]
)
# Datum-hantering
df["datum"] = pd.to_datetime(df["datum"])
df["månad"] = df["datum"].dt.month
df["veckodag"] = df["datum"].dt.day_name()
df["kvartal"] = df["datum"].dt.quarter
# Sortera
df_sorted = df.sort_values("total", ascending=False)Groupby — aggregera och analysera
groupby är kanske Pandas mest kraftfulla funktion. Den grupperar data baserat på en eller flera kolumner och applicerar aggregeringsfunktioner — summa, medelvärde, antal, eller egna funktioner.
# Försäljning per stad
per_stad = df.groupby("stad")["total"].agg([
"sum", "mean", "count"
]).sort_values("sum", ascending=False)
print(per_stad.head())
# sum mean count
# Stockholm 450000 380.50 1183
# Göteborg 280000 320.10 875
# Malmö 195000 290.80 670
# Gruppera på flera kolumner
per_stad_kategori = df.groupby(
["stad", "kategori"]
)["total"].sum().unstack(fill_value=0)
# Anpassad aggregering
sammanfattning = df.groupby("kategori").agg({
"pris": ["mean", "median", "std"],
"antal": "sum",
"total": ["sum", "max"],
}).round(2)
# Pivot-tabeller — som Excel men i kod
pivot = pd.pivot_table(
df,
values="total",
index="stad",
columns="kategori",
aggfunc="sum",
fill_value=0,
margins=True # Lägg till totaler
)Merge — kombinera dataset
I verkliga projekt har du sällan all data i en fil. merge är Pandas motsvarighet till SQL JOIN — du kombinerar tabeller baserat på gemensamma kolumner.
# Två separata dataset
orders = pd.read_csv("orders.csv")
customers = pd.read_csv("customers.csv")
# Inner join (bara matchande rader)
merged = pd.merge(
orders,
customers,
on="customer_id",
how="inner"
)
# Left join (alla orders, matcha med kund om möjlig)
merged = pd.merge(
orders,
customers,
on="customer_id",
how="left"
)
# Merge på olika kolumnnamn
merged = pd.merge(
orders,
customers,
left_on="kund_id",
right_on="id",
how="left"
)
# Konkatenera (stapla vertikalt)
q1 = pd.read_csv("q1_2026.csv")
q2 = pd.read_csv("q2_2026.csv")
helår = pd.concat([q1, q2], ignore_index=True)Tidsserieanalys
Pandas har kraftfullt stöd för tidsseriedata. Resample för att aggregera per tidsenhet, rolling för glidande medelvärden, och shift för att jämföra med föregående perioder.
# Sätt datum som index
df = df.set_index("datum").sort_index()
# Daglig till månatlig aggregering
månatlig = df["total"].resample("M").sum()
# Glidande medelvärde (7 dagar)
df["rolling_7d"] = df["total"].rolling(
window=7
).mean()
# Jämför med föregående månad
df["förra_månaden"] = df["total"].shift(30)
df["förändring_%"] = (
(df["total"] - df["förra_månaden"])
/ df["förra_månaden"] * 100
).round(1)
# Tidsbaserad filtrering
q1_2026 = df["2026-01":"2026-03"]
mars = df["2026-03"]Visualisering med Matplotlib
Pandas har inbyggd plotting via Matplotlib. Det räcker inte för publikationer, men det är perfekt för snabb explorativ analys.
import matplotlib.pyplot as plt
# Linjediagram — försäljningstrend
df["total"].resample("W").sum().plot(
figsize=(12, 5),
title="Veckovis försäljning 2026",
ylabel="SEK",
)
plt.tight_layout()
plt.savefig("trend.png", dpi=150)
# Stapeldiagram — försäljning per kategori
df.groupby("kategori")["total"].sum().plot(
kind="bar",
title="Försäljning per kategori",
color=["#3b82f6", "#10b981", "#f59e0b", "#ef4444"],
)
plt.tight_layout()
plt.savefig("kategorier.png", dpi=150)Pandas är ett oumbärligt verktyg för alla som jobbar med data i Python. Lär dig grunderna i Python i vår Python-programmeringsguide, eller kolla in vår guide för nybörjare om du precis har börjat.