- Leren
- Informatica & ICT
- Data science & AI
- Data-analyse met Python: NumPy, pandas en visualisatie
- Gegevens inlezen en opslaan
Gegevens inlezen en opslaan
GemiddeldLes 3 van 8 in Cursus Data-analyse met Python: NumPy, pandas en visualisatie
Wat je leert
- Lees CSV- en andere tekstbestanden met scheidingstekens in met
pd.read_csv, bepaal hoe pandas de kolommen splitst, benoemt en van een datatype voorziet en controleer het resultaat voordat je het analyseert.- Lees een CSV-bestand in en inspecteer het resultaat in pandasLees een bestand met komma's als scheidingsteken in een DataFrame in, kies de kopregel, kolomnamen, index en te behouden kolommen en controleer de datatypes die pandas heeft afgeleid.
- Verwerk scheidingstekens en regionale getalnotatiesHerken het scheidingsteken, decimaalteken en scheidingsteken voor duizendtallen in een bestand en stel
sep,decimalenthousandszo in dat getallen als getallen worden ingelezen. - Bepaal bij het inlezen hoe ontbrekende waarden, kolomtypes en datums worden verwerktGeef pandas aan welke markeringen “ontbrekend” betekenen, behoud identificatiecodes als tekst, kies numerieke types en lees datums in met een expliciet formaat.
- Lees bestanden met een onregelmatige indeling inSla titelregels, commentaar en afsluitende rapportregels over, lees kopregels over meerdere rijen en kolommen met vaste veldbreedtes in en bepaal wat je met onjuist opgebouwde regels doet.
- Lees een CSV-bestand in en inspecteer het resultaat in pandas
- Begrijp hoe tekst als bytes wordt opgeslagen, los coderingsfouten en verminkte tekens op en lees bestanden die te groot zijn of te langzaam laden om ze in één keer in te lezen.
- Begrijp hoe tekens als bytes worden weergegevenLeg uit wat een tekencodering is en herken ASCII, UTF-8, Latin-1, Windows-1252, UTF-16 en de bytevolgordemarkering.
- Stel coderingsproblemen vast en los ze opHerken een decoderingsfout en verminkte tekst, vind de juiste tekencodering en schrijf bestanden die andere programma's correct lezen.
- Lees grote en gecomprimeerde tekstbestanden efficiënt inVerminder het geheugengebruik bij het inlezen, verwerk een bestand in gegevensblokken, combineer deelresultaten correct en lees gecomprimeerde bestanden rechtstreeks in.
- Begrijp hoe tekens als bytes worden weergegeven
- Lees gegevens uit werkbladen met titels, samengevoegde cellen en formules en schrijf een of meer DataFrames naar een werkmap voor anderen.
- Lees werkbladen uit Excel-werkmappen inKies het werkblad en de rijen en kolommen die je wilt inlezen en weet wat pandas doet met datums, formules, samengevoegde cellen en opmaak.
- Schrijf DataFrames naar Excel-werkmappenSla een of meer tabellen op in een werkmap die collega's kunnen openen en voorkom dat je gegevens overschrijft of verkeerd benoemt.
- Lees werkbladen uit Excel-werkmappen in
- Lees en schrijf JSON, zet geneste records om in tabellen en vraag betrouwbaar en veilig gegevens op bij web-API's.
- Lees en schrijf JSON-gegevensKen de syntaxis van JSON en de omzetting naar Python-objecten en lees en schrijf JSON en JSON Lines met Python en pandas.
- Zet geneste JSON om in een platte tabelZet geneste objecten en lijsten met
pd.json_normalizeom in kolommen en rijen en bepaal wat één rij voorstelt. - Vraag gegevens op bij een web-APIRoep een API aan met de bibliotheek requests, controleer het antwoord, verwerk sleutels, pagina's en verzoeklimieten en lees tabellen van webpagina's.
- Lees en schrijf JSON-gegevens
- Schrijf opgeschoonde resultaten naar CSV, vergelijk tekstuele en binaire formaten en gebruik Parquet om gegevens tussen analysestappen compact en met de juiste types te bewaren.
- Schrijf DataFrames naar CSV- en tekstbestandenBepaal de index, ontbrekende waarden, getal- en datumnotaties en tekencodering van geschreven bestanden en bewaar ruwe gegevens veilig.
- Vergelijk tekstuele en binaire opslagformatenLeg uit hoe tekstformaten en rijgeoriënteerde en kolomgeoriënteerde binaire formaten verschillen en kies CSV, Excel, JSON, Parquet, Feather, pickle of een database voor een bepaalde taak.
- Lees en schrijf Parquet-bestandenSla DataFrames met hun types op als Parquet, lees geselecteerde kolommen in en orden gegevens als een gepartitioneerde dataset.
- Schrijf DataFrames naar CSV- en tekstbestanden
- Verbind pandas met een database, lees queryresultaten in met parameters en de juiste types en schrijf DataFrames veilig naar tabellen.
- Maak verbinding met een database en lees queryresultaten inOpen een verbinding met SQLite of een andere database, voer vanuit pandas een gegeven SQL-query uit en beheer toegangsgegevens en verbindingen.
- Geef queryparameters veilig door en bepaal de datatypes van de resultatenVoeg waarden met parameters aan query's toe in plaats van met tekenreeksopmaak en zorg voor de juiste datums, gehele getallen en blokgroottes in het resultaat.
- Schrijf DataFrames naar databasetabellenMaak tabellen met
to_sql, voeg er rijen aan toe en vervang ze, kies kolomtypes en controleer en herhaal schrijfbewerkingen veilig.
- Maak verbinding met een database en lees queryresultaten in
Gegevens inlezen en opslaan: uitleg
1Lees tekstbestanden met scheidingstekens in met pandas
Tekstbestanden kunnen op tabellen lijken terwijl belangrijke keuzes niet zijn vastgelegd. Je leest records in pandas in, controleert de resulterende rijen en kolommen en kiest opties voor kopregels, velden tussen aanhalingstekens, getalnotaties, markeringen voor ontbrekende waarden en datums. Ook zoek je de werkelijke waarnemingen op in rapporten met titels, commentaar en totalen, zodat je na het inlezen de bedoelde tabel en waarden krijgt.
Gebruik je Excel in het Engels? Typ dan komma's in plaats van puntkomma's en deze namen: SOM is SUM.
1.1 Van CSV-records naar een gecontroleerde tabel
Een CSV-bestand is gewone tekst die is ingedeeld in records en velden. Komma's scheiden meestal de velden en het eerste record levert vaak kolomnamen. Het bestand bevat tekens, geen pandas-gegevensschema, dus bij het inlezen bepaal je ook wat die tekens voorstellen.
Lees een klein bestand in en inspecteer het
Stel dat een bestand dit bevat:
order_id,date,region,units,price
1001,2026-03-02,North,3,4.50
1002,2026-03-02,South,1,12.00
1003,2026-03-03,North,2,7.25
Lees het in en inspecteer het resultaat:
import pandas as pd
df = pd.read_csv("sales.csv")
print(df.head())
print(df.shape)
print(df.dtypes)
df.info()
De vorm is (3, 5): drie gegevensrijen en vijf kolommen. pandas leidt int64 af voor order_id en units en float64 voor price. De kolom date bevat nog tekst. In pandas 3 tonen afgeleide tekstkolommen normaal str; oudere pandas-versies tonen vaak object.
Elke inspectie beantwoordt een andere vraag. head() laat zien of velden bij hun labels passen. shape brengt ontbrekende rijen of een onverwachte extra kolom aan het licht. dtypes controleert de interpretatie en info() voegt het aantal aanwezige waarden toe. Als een kolom die voor getallen is bedoeld als tekst wordt ingelezen, bekijk dan de ruwe waarden: een eenheid, een plaatsaanduiding of een andere decimale notatie kan verhinderen dat een numeriek type wordt afgeleid.
Laat labels bij records passen
Gebruik voor een bestand zonder kopregel waarvan de eerste regel 1001,North,3 is:
df = pd.read_csv(
"orders.txt",
header=None,
names=["id", "region", "units"]
)
Zonder die keuze neemt pandas het eerste record als kopregel. De waarden worden kolomnamen en het record verdwijnt uit de gegevens. Gebruik index_col="order_id" als een bestaande kolom de rijen moet labelen. Gebruik usecols=["region", "units"] om alleen die kolommen in te lezen, of nrows=1000 om de eerste 1.000 gegevensrijen te inspecteren voordat je een groot bestand inleest.
Laat de CSV-leesfunctie aanhalingstekens verwerken
Het record "Smith, Jane",Boston,10 heeft drie velden. De komma binnen de naam tussen aanhalingstekens hoort bij die naam. Twee dubbele aanhalingstekens binnen een veld tussen aanhalingstekens stellen één letterlijk dubbel aanhalingsteken voor: "O'Neil ""Red""" wordt O'Neil "Red". Een veld tussen aanhalingstekens kan zelfs een regeleinde bevatten, dus records en fysieke regels komen niet altijd overeen.
De aanroep line.split(",") splitst de naam en kan deze regels niet verwerken. read_csv verwerkt ze tijdens het inlezen. pd.read_table gebruikt standaard een tab als scheidingsteken; pd.read_fwf verwerkt velden die zijn gedefinieerd door tekenposities.
Zoek het bestand dat Python probeert te vinden
Een relatief pad wordt bepaald vanuit de huidige werkmap van het programma. Als "data/sales.csv" niet kan worden gevonden, inspecteer de werkmap dan met Path.cwd() na from pathlib import Path. Je kunt ook een absoluut pad, een Path-object, een URL of een tekstbestand in het geheugen zoals StringIO aan read_csv doorgeven. Controleer de locatie voordat je inleesopties wijzigt: een ontbrekend bestand en een verkeerd ingelezen bestand zijn verschillende problemen.
Belangrijkste punten
- CSV slaat tekens op; pandas leidt bij het inlezen de kolomtypes af.
- Controleer na het inlezen de eerste rijen, vorm, types en aantallen aanwezige waarden.
- Gebruik
header=Noneennamesals het bestand geen kopregel heeft. - Scheidingstekens en regeleinden tussen aanhalingstekens horen bij velden; gebruik een CSV-parser.
- Relatieve paden beginnen vanuit de huidige werkmap.
1.2 Scheidingstekens en getallen correct inlezen
Een scheidingsteken scheidt velden; een decimaalteken scheidt het gehele en het decimale deel van een getal. Een scheidingsteken voor duizendtallen groepeert cijfers. Deze drie functies vereisen aparte instellingen, ook als hetzelfde symbool in verschillende bestanden een andere functie heeft.
Inspecteer tekens voordat je opties kiest
Bekijk enkele ruwe regels in een editor. Een .csv-extensie garandeert geen komma's en .txt duidt geen bepaalde indeling aan. Veelgebruikte instellingen zijn:
| Bestandsindeling | Inleesoptie |
|---|---|
| Velden gescheiden door tabs | sep="\t" |
| Velden gescheiden door verticale strepen | `sep=" |
| Velden gescheiden door reeksen spaties | sep=r"\s+" |
| Velden gescheiden door puntkomma's | sep=";" |
Je kunt het begin inspecteren zonder het hele bestand in te lezen:
with open("products.csv", encoding="utf-8") as f:
print(f.readline())
print(f.readline())
Doorloop een regionale export
Bekijk deze tekst:
product;price;qty
Tea;3,50;1.200
Coffee;12,90;850
De puntkomma's scheiden velden, de komma is het decimaalteken en de punt groepeert duizendtallen. Geef alle drie de conventies expliciet op bij het inlezen:
df = pd.read_csv(
"products.csv",
sep=";",
decimal=",",
thousands="."
)
De prijzen worden 3,5 en 12,9. De aantallen worden 1200 en 850. Met de standaardkomma als scheidingsteken beschrijft deze kopregel geen drie door komma's gescheiden kolommen. Zelfs nadat je sep=";" hebt gekozen, ben je nog niet klaar: de prijzen blijven tekst en "1.200" kan het decimale getal 1,2 worden. Dat laatste resultaat is een geldig getal met de verkeerde betekenis, dus voor een ernstige fout hoeft geen inleesuitzondering op te treden.
Vergelijk enkele ingelezen waarden met hun brontekst en inspecteer describe() op onwaarschijnlijke bereiken. Een aantal dat je in de duizenden verwacht en dat rond één uitkomt, wijst op een probleem met de getalnotatie. Alleen het scheidingsteken wijzigen lost dat niet op.
Houd veldgrenzen gescheiden van de groepering van getallen
In een bestand met komma's als scheidingsteken moet een gegroepeerd getal zoals "1,234.50" tussen aanhalingstekens staan. De komma binnen het getal maakt er deel van uit. Met thousands="," kan pandas het veld tussen aanhalingstekens lezen als 1234,5. Zonder aanhalingstekens maakt de komma ook een veldgrens; thousands kan de verloren recordstructuur niet herstellen.
Kies een geschikte parser
De standaardparser in C verwerkt veelvoorkomende indelingen snel. De Python-parser ondersteunt detectie van het scheidingsteken met sep=None, reguliere expressies als scheidingsteken en skipfooter. De detectie onderzoekt een deel van het bestand en kan bij een onregelmatig rapport verkeerd kiezen, dus geef een bekend scheidingsteken direct op.
Een scheidingsteken van meer dan één teken wordt doorgaans als reguliere expressie behandeld en vereist de Python-parser; r"\s+" is een bijzonder geval dat ook door de C-parser wordt ondersteund. De PyArrow-parser kan met parallelle threads lezen, maar ondersteunt andere opties. Zo wordt chunksize niet ondersteund met engine="pyarrow". Kies de parser op basis van de opties die je bestand nodig heeft en controleer vervolgens de structuur en waarden van het resultaat.
Belangrijkste punten
- Kies
sep,decimalenthousandselk voor hun eigen functie. - Een resultaat dat op een getal lijkt, kan er nog steeds een factor 1.000 naast zitten.
- Zet een veld tussen aanhalingstekens als de inhoud het scheidingsteken bevat.
- De Python-parser ondersteunt detectie en
skipfooter; de opties verschillen per parser.
1.3 Ontbrekende waarden, identificatiecodes en datums
Automatische typeafleiding kan niet weten of 999 een meting is of een code voor een onbekende waarde. Ook kan die niet weten of voorloopnullen betekenis hebben. Gebruik de definities van de gegevens om inleesopties in te stellen voordat de typeafleiding die waarden verandert.
Geef aan waar markeringen voor ontbrekende waarden gelden
pandas herkent lege velden en ingebouwde markeringen zoals "NA", "N/A", "n/a", "NULL", "NaN" en "None". Een bron kan extra markeringen gebruiken. Stel dat score 88, "n/a", "-" en 999 bevat, waarbij 999 als onbekend is gedefinieerd:
df = pd.read_csv(
"scores.csv",
na_values={"score": ["-", "999"]}
)
De scorekolom bevat nu 88,0 en drie ontbrekende waarden. Zonder de markeringen op te geven kan "-" ervoor zorgen dat de kolom tekst blijft; een niet-opgegeven numerieke signaalwaarde kan in berekeningen terechtkomen. Het gemiddelde van 88 en 999 is 543,5, hoewel de enige bekende score 88 is.
Een dictionary beperkt een markering tot de bijbehorende kolom. Een na_values=["999"] voor het hele bestand zou ook een echte productcode 999 verwijderen. Als "NA" een echt label is, gebruik dan keep_default_na=False om de ingebouwde lijst met markeringen uit te schakelen en geef expliciet de markeringen op die wel ontbreken betekenen. Neem bij die instelling "" op als lege velden nog steeds als ontbrekend moeten tellen.
Behoud waarden volgens hun functie
Lees identificatiecodes als tekst:
df = pd.read_csv(
"visits.csv",
dtype={"site_code": str, "visits": "Int64"}
)
Een code zoals "00501" moet vijf tekens lang blijven. Als je die als geheel getal inleest, krijg je 501; als je dat gehele getal later naar tekst converteert, krijg je "501", niet de oorspronkelijke code. Gebruik een numeriek type voor waarden waarmee je rekent.
Gewone NumPy-kolommen met gehele getallen kunnen geen NaN bevatten, dus wordt een telkolom met een ontbrekende waarde vaak float64. Het pandas-type "Int64", met een hoofdletter I, ondersteunt ontbrekende waarden, behoudt gehele getallen en geeft een ontbrekende waarde weer met <NA>. dtype_backend="numpy_nullable" vraagt voor het hele resultaat om types met ondersteuning voor ontbrekende waarden. Voor een kleine, herhaalde verzameling labels slaat dtype={"region": "category"} de labels op als categorieën en kan dit het geheugengebruik verminderen.
Geef op hoe datums zijn geschreven
Tekst die op een datum lijkt, blijft tekst totdat die als datum wordt ingelezen. Gebruik voor datums met de dag eerst, zoals "03/04/2026" en "13/04/2026":
df = pd.read_csv(
"events.csv",
parse_dates=["day"],
date_format="%d/%m/%Y"
)
Deze waarden worden 3 april en 13 april. Zonder formaat kan een keuze voor de maand eerst geldige dagen en maanden verwisselen of kan de conversie van de kolom mislukken. dayfirst=True geeft een voorkeur aan; een expliciet formaat legt de verwachte structuur vast. ISO-datums zoals "2026-04-03" voorkomen dubbelzinnigheid over dag en maand.
Inspecteer na het inlezen dtypes, isna().sum() en het aantal rijen. Controleer een datum waarvan de interpretatie de conventies van elkaar onderscheidt. Als een kolom nog tekst toont, zijn bij het inlezen niet de bedoelde datum-tijdwaarden ontstaan; een onverwachte stijging van het aantal ontbrekende waarden kan aangeven dat een echt label voor een markering is aangezien.
Belangrijkste punten
- Geef bronspecifieke markeringen voor ontbrekende waarden op, bij voorkeur per kolom.
- Gebruik
keep_default_na=Falseals een ingebouwde markering een echte gegevenswaarde is. - Lees identificatiecodes die alleen uit cijfers bestaan als tekst om voorloopnullen te behouden.
- Gebruik
Int64met ondersteuning voor ontbrekende waarden voor tellingen met ontbrekende waarden. - Geef dubbelzinnige datums een expliciet formaat en controleer hun datatype.
- Vergelijk de aantallen ontbrekende waarden met de bron.
1.4 Tabellen in rapporten en bestanden met vaste veldbreedtes
Een rapport kan een tabel combineren met titels, lege regels, commentaar, totalen en bronvermeldingen. Zoek eerst de kopregel en de grenzen van de gegevens. Anders kan een leesfunctie een titel voor kolomnamen aanzien of een totaal als gewone waarneming opnemen.
Lees alleen de tabel in
Een rapport bevat deze negen fysieke regels:
Monthly sales report
Exported 2026-04-01
region,jan,feb
North,120,135
# test row below
South,98,101
Total,218,236
Source: internal system
De eerste drie regels staan vóór de kopregel. De laatste twee zijn geen waarnemingen. Lees het rapport zo in:
df = pd.read_csv(
"report.csv",
skiprows=3,
comment="#",
skipfooter=2,
engine="python"
)
Het resultaat heeft twee rijen. Het totaal voor januari is 218 uit North en South. Als je de totaalrij behoudt, komt daar nog eens 218 bij en rapporteer je 436. Met de standaardinstellingen kan de titel met één veld daarentegen de kopregel worden en tot een inleesfout leiden wanneer records met drie velden volgen.
skiprows=3 telt de eerste drie fysieke regels, inclusief de lege regel. Een lijst zoals skiprows=[0, 2] verwijdert specifieke regelposities, geteld vanaf nul. Lege regels worden standaard overgeslagen en comment="#" verwijdert commentaartekst. skipfooter vereist de Python-parser. Stem deze instellingen af op de werkelijke indeling; een vast aantal over te slaan regels kan onjuist worden als een exportprogramma een titelregel toevoegt.
Onderzoek onjuist opgebouwde records
Een record met te veel velden kan on_bad_lines="error", de standaardinstelling, activeren. "warn" slaat het record over met een waarschuwing, terwijl "skip" het zonder melding verwijdert. Inspecteer het ruwe record voordat je een van beide kiest. Een komma binnen een naamveld zonder aanhalingstekens of een verkeerd scheidingsteken kan extra velden maken; als je het record dan overslaat, verlies je een geldige waarneming in plaats van de oorzaak op te lossen.
Te weinig velden gedragen zich anders. Onder id,name,score wordt het record 2,Ben ingelezen met een ontbrekende score. Dat hoeft geen fout te geven. Controleer zowel het aantal ontbrekende waarden als het aantal rijen en vergelijk de behouden records met de bron als je onjuist opgebouwde regels uitsluit.
Lees kopregels op meerdere rijen of tekenposities
Twee rijen met kolomlabels kunnen een MultiIndex vormen. Met de groepslabels region,sales,sales boven ,2025,2026 geeft header=[0, 1] labels zoals ("sales", "2025"). Als platte labels beter bij de analyse passen, sla dan beide kopregels over en geef names=["region", "sales_2025", "sales_2026"] op.
Tekst met vaste veldbreedtes heeft geen scheidingsteken. Kolomgrenzen zijn tekenposities:
df = pd.read_fwf(
"readings.txt",
colspecs=[(0, 4), (4, 11), (11, 16)]
)
Deze halfopen bereiken omvatten elk beginpunt en sluiten het eindpunt uit. Het eerste veld beslaat de posities 0 tot en met 3 en het volgende begint bij 4. widths=[4, 7, 5] beschrijft dezelfde indeling. Automatische afleiding is handig bij regelmatige voorbeelden; expliciete grenzen voorkomen dat een korte waarde aan het begin de verkeerde breedte bepaalt.
Belangrijkste punten
- Zoek de kopregel, waarnemingen en afsluitende rapportregels voordat je opties kiest om regels over te slaan.
- Totaalrijen die als waarnemingen worden opgenomen, kunnen een som verdubbelen.
- Als je onjuiste regels overslaat, verlies je records; onderzoek eerst extra velden.
- Korte records kunnen worden ingelezen met ontbrekende waarden aan het einde.
- Gebruik bij deze indelingen kopregels over meerdere rijen of expliciete grenzen voor vaste veldbreedtes.
2Lees tekst correct en efficiënt in
Correcte tekst hangt af van de regel waarmee de bytes worden gedecodeerd en efficiënt inlezen hangt af van wat het programma in het geheugen bewaart. Je onderscheidt coderingsfouten van verminkte tekst, kiest op basis van aanwijzingen een tekencodering en behoudt tekens tijdens uitwisseling. Daarna verminder je het geheugengebruik bij grote bestanden door kolommen te selecteren, geschikte types te kiezen en gegevens in blokken te verwerken, waarbij je ook leert deelresultaten correct te combineren.
2.1 Hoe tekst als bytes wordt opgeslagen
Een bestand slaat bytes op, elk met een waarde van 0 tot en met 255. Een tekencodering bepaalt hoe tekens door die bytes worden weergegeven. Coderen zet Python-tekst om in bytes; decoderen zet bytes terug om in tekst. Dezelfde bytes kunnen volgens verschillende decoderingsregels verschillende tekens betekenen.
Tel tekens en bytes afzonderlijk
text = "café"
raw = text.encode("utf-8")
print(len(text)) # 4 characters
print(len(raw)) # 5 bytes
print(raw.decode("utf-8")) # café
Het accent maakt hier geen tweede zichtbaar teken. De letter "é" heeft in UTF-8 twee bytes nodig, dus nemen vier tekens vijf bytes in. Het aantal bytes en het aantal tekens beantwoorden verschillende vragen.
ASCII definieert 128 tekens, waaronder Engelse basisletters, cijfers, leestekens en besturingscodes. Hun bytewaarden komen overeen in ASCII, UTF-8, Latin-1 en Windows-1252. Dit gedeelde begin verklaart waarom een voorbeeld met alleen Engelse tekst correct kan lijken, ook als de tekencodering verkeerd is ingesteld.
Herken de belangrijkste coderingsfamilies
| Tekencodering | Weergave van tekst | Handige aanwijzing |
|---|---|---|
| UTF-8 | Eén tot vier bytes per Unicode-teken | ASCII-letters gebruiken één byte; "é" gebruikt er twee |
| Latin-1 | Eén byte per teken in het beperkte repertoire | Elke bytewaarde kan worden gedecodeerd |
| Windows-1252 | Eén byte per ondersteund teken | Bevat extra afdrukbare symbolen zoals "€" |
| UTF-16 | Meestal twee bytes per teken, vier voor andere | De bytevolgorde is van belang |
UTF-8 geeft elk Unicode-teken weer en is de gebruikelijke keuze voor uitgewisselde tekst. Latin-1 en Windows-1252 geven een kleinere verzameling tekens weer. Ze komen overeen voor veel letters met accenten, maar verschillen in een deel van het bytebereik: Windows-1252 gebruikt byte 0x80 voor "€", waar Latin-1 een besturingsteken heeft. Het zijn geen uitwisselbare namen voor één codering.
Lees bytevolgordemarkeringen correct
Een bytevolgordemarkering, of BOM, is een markering aan het begin van sommige bestanden. UTF-16 kan beginnen met FF FE voor de little-endianvolgorde of FE FF voor de big-endianvolgorde. encoding="utf-16" gebruikt de BOM om de volgorde te kiezen. Zonder BOM geef je "utf-16-le" of "utf-16-be" op, afhankelijk van de bron.
Een UTF-8-BOM is EF BB BF. open(..., encoding="utf-8-sig") van Python verwijdert die tijdens het decoderen. Gewoon "utf-8" in open() behoudt die als \ufeff, wat onverwacht deel kan worden van de eerste kolomnaam. De CSV-leesfunctie van pandas verwerkt een UTF-8-BOM aan het begin ook, maar met utf-8-sig maak je de bedoelde bestandsconventie duidelijk.
Geef de tekencodering expliciet op
with open("notes.txt", encoding="utf-8") as f:
text = f.read()
De standaardwaarde van open() hangt af van de Python-versie en de UTF-8-modus. Python 3.11–3.14 kan de codering van de landinstellingen gebruiken; Python 3.15 schakelt standaard de UTF-8-modus in, die je kunt uitschakelen. Met een expliciete codering blijft het script op verschillende computers afgestemd op het werkelijke bestandsformaat. Ook voorkom je dat een platformstandaard ongemerkt verandert hoe dezelfde bytes worden gelezen.
Belangrijkste punten
- Coderen zet tekst om in bytes; decoderen zet bytes om in tekst.
- Het aantal tekens en het aantal bytes kunnen verschillen.
- Voorbeelden met alleen ASCII-tekens kunnen een verkeerde coderingskeuze verhullen.
- Latin-1 en Windows-1252 verschillen, hoewel ze veel tekens delen.
- Gebruik informatie over de BOM en bytevolgorde bij het lezen van UTF-16.
- Geef de bedoelde tekencodering expliciet door aan
open().
2.2 Vind de oorzaak van verminkte tekst
Een verkeerde tekencodering kan duidelijk misgaan met een UnicodeDecodeError, of ongemerkt leesbaar ogende onzin opleveren: mojibake. Beide problemen beginnen bij het interpreteren van bytes volgens de verkeerde regel. Bewaar het oorspronkelijke bestand zodat je het opnieuw kunt decoderen.
Stel de oorzaak van een fout vast
Een als Windows-1252 opgeslagen CSV bevat plaatsnamen waaronder "Zürich" en "Málaga". Als je het als UTF-8 leest, kan het misgaan bij byte 0xfc, die in Windows-1252 voor "ü" wordt gebruikt. Zodra de exportinstellingen van de bron de codering bevestigen, lees je het bestand zo in:
df = pd.read_csv("cities.csv", encoding="cp1252")
print(df["city"].head())
Inspecteer namen met accenten of symbolen. Een voorbeeld dat volledig uit ASCII-tekens bestaat, kan deze coderingen niet onderscheiden. Een bepaalde ongeldige byte in UTF-8 wijst op een mogelijke oudere codering, maar bepaalt niet eenduidig welke oudere codering het bestand heeft voortgebracht.
Herken een fout zonder foutmelding
Bytes in UTF-8 die als Windows-1252 worden gedecodeerd, kunnen "café" veranderen in "café" en "São Paulo" in "São Paulo". De leesfunctie heeft met succes tekens geproduceerd, maar het zijn de verkeerde tekens. Lees de oorspronkelijke bytes opnieuw met UTF-8:
df = pd.read_csv("cities.csv", encoding="utf-8")
Met zoeken en vervangen herstel je telkens één zichtbaar symptoom en kun je andere beschadigde letters missen. Ook loop je het risico een werkelijk voorkomend teken te veranderen. Correct decoderen pakt de oorzaak voor het hele bestand aan.
Verzamel aanwijzingen voor de tekencodering
Begin bij de documentatie of exportinstellingen van de leverancier. Inspecteer zo nodig een klein voorbeeld van de bytes:
with open("cities.csv", "rb") as f:
sample = f.read(200)
print(sample)
De binaire modus behoudt de bytes zonder ze te decoderen. Een BOM kan een directe aanwijzing geven. Een detectieprogramma zoals charset-normalizer schat een waarschijnlijke codering, maar een kort voorbeeld kan bij meerdere mogelijkheden passen. Controleer het resultaat aan de hand van bekende namen met accenten en symbolen.
Latin-1 kent aan elke byte een teken toe en kan daardoor elke bytereeks zonder fout decoderen. Dat dit lukt, zegt op zichzelf niets over de juistheid van de tekens. Windows-1252 gebruikt ook tekens van één byte, maar laat enkele bytewaarden ongedefinieerd en kan een decoderingsfout geven.
Gooi de aanwijzingen niet weg
encoding_errors="replace" vervangt bytes die de decoder niet kan lezen door "�". encoding_errors="ignore" verwijdert ze. Deze opties kunnen helpen om beschadigde invoer te inspecteren, maar ze leiden tot informatieverlies en vervangen het zoeken naar de juiste codering niet. Een naam die is veranderd in "Zrich" kan een overeenkomst net zo goed verhinderen als zichtbaar verminkte tekst.
Voor uitvoer verwerkt UTF-8 de grootste verscheidenheid aan tekens. Sommige spreadsheetprogramma's herkennen die codering betrouwbaarder als er een BOM aanwezig is:
df.to_csv("cities_export.csv", index=False, encoding="utf-8-sig")
Open de export opnieuw in het ontvangende programma en inspecteer dezelfde waarden met accenten. Het doel is correcte tekst aan beide kanten van de uitwisseling.
Belangrijkste punten
- Controleer zowel decoderingsfouten als zichtbaar verminkte tekens.
- Lees de oorspronkelijke bytes opnieuw met de juiste tekencodering om mojibake te herstellen.
- Als decoderen met Latin-1 lukt, staat daarmee niet vast dat de tekst correct is.
- De modi voor vervangen en negeren laten tekeninformatie verloren gaan.
- Gebruik UTF-8 met een BOM als het ontvangende spreadsheetprogramma die nodig heeft.
2.3 Lees grote bestanden zonder elke rij te bewaren
De grootte van een bestand op schijf is niet gelijk aan de hoeveelheid geheugen die het nodig heeft. pandas bouwt arrays, indexen en tekstwaarden op in het geheugen en hun types beïnvloeden de benodigde ruimte. Meet met df.memory_usage(deep=True) of df.info(memory_usage="deep") voordat je beslist hoe je meer gegevens inleest.
Verminder de gegevens die je in het geheugen inleest
Lees geselecteerde kolommen met usecols, inspecteer een eerste steekproef met nrows en kies geschikte types met dtype. Een categorie kan herhaalde regionamen compact opslaan. float32 gebruikt minder ruimte dan float64, maar biedt ongeveer zeven significante cijfers, dus kies dit type alleen als die precisie bij de metingen past. Een kleine voorvertoning helpt types te herkennen, maar bewijst niet dat elke latere rij hetzelfde patroon volgt.
Verwerk gegevensblokken en bewaar een klein resultaat
chunksize verandert de teruggegeven waarde van een DataFrame in een iterator van DataFrames. Voor een totaal en een gemiddelde:
total = 0.0
count = 0
with pd.read_csv(
"measurements.csv",
usecols=["amount"],
chunksize=100_000
) as reader:
for chunk in reader:
total += chunk["amount"].sum()
count += chunk["amount"].count()
mean = total / count if count else float("nan")
De lus houdt een cumulatieve som en het aantal aanwezige waarden bij. Elk gegevensblok kan na gebruik worden vrijgegeven. Als je alle blokken in een lijst verzamelt en later aaneenvoegt, heb je opnieuw evenveel geheugen nodig als voor het geheel; blokgewijze verwerking bespaart alleen geheugen als het werk een kleiner resultaat bewaart of verwerkte delen wegschrijft.
Een bestand van tien rijen dat je met chunksize=4 inleest, levert delen van 4, 4 en 2 rijen op. Bij bedragen van 1 tot en met 10 met afwisselend de regio's N, S en E tel je de regionale deeltotalen op tot N 22, S 15 en E 18. Samen is dat 55.
Combineer de juiste grootheden
Sommen en aantallen kun je optellen. Combineer minima door het kleinste deelminimum te nemen; combineer maxima door het grootste deelmaximum te nemen. Gemiddelden hebben gewichten nodig, omdat blokken verschillende aantallen geldige waarnemingen kunnen bevatten.
Voor de waarden 1, 2 en 3 in het ene blok en 10 in het andere zijn de blokgemiddelden 2 en 10. Het gemiddelde van die gemiddelden is 6, waarbij het blok met één waarde even zwaar meetelt als het blok met drie waarden. Tel in plaats daarvan de sommen en aantallen op: een totaal van 16 over vier waarnemingen geeft een gemiddelde van 4. Blokmedianen bevatten niet genoeg informatie om een totale mediaan te reconstrueren.
Lees gecomprimeerde bestanden rechtstreeks in
read_csv leidt compressie normaal af uit herkende extensies zoals .gz, .bz2, .zip, .xz en .zst. Tijdens het inlezen wordt gedecomprimeerd:
with pd.read_csv("measurements.csv.gz", chunksize=100_000) as reader:
for chunk in reader:
print(len(chunk))
Een ZIP-archief dat je zo gebruikt, moet precies één gegevensbestand bevatten. df.to_csv("out.csv.gz", index=False) schrijft met gzip gecomprimeerde CSV. Compressie vermindert de schijfruimte en de hoeveelheid over te dragen gegevens, maar neemt het geheugengebruik van de gedecodeerde tabel niet weg. Voor herhaalde analyse voorkomt het converteren van een gecontroleerde dataset naar Parquet ook dat tekst steeds opnieuw moet worden ingelezen en worden de opgeslagen kolomtypes hersteld.
Belangrijkste punten
- Meet het geheugengebruik inclusief objectinhoud en lees alleen benodigde kolommen in.
- Leesfuncties met gegevensblokken leveren DataFrames op; bewaar kleinere resultaten om geheugen te besparen.
- Combineer sommen en aantallen aanwezige waarden voordat je een totaalgemiddelde berekent.
- Blokmedianen kunnen niet tot de totale mediaan worden gecombineerd.
- Gecomprimeerde tekst wordt tijdens het inlezen gedecomprimeerd; een ZIP heeft één gegevensbestand nodig.
- Parquet is geschikt voor datasets die herhaaldelijk worden ingelezen.
3Werk met Excel-werkmappen
Werkmappen combineren gegevens met een presentatie voor mensen: meerdere werkbladen, titels, formules, samengevoegde labels en weergaveopmaak. Je zoekt een tabel binnen die indeling en maakt onderscheid tussen opgeslagen waarden en wat een cel weergeeft. Daarna schrijf je rapporten met één of meer werkbladen, bepaal je hoe een bestaande werkmap wordt bijgewerkt en controleer je of de opgeslagen werkbladen de bedoelde rijen en waarden bevatten.
3.1 Zoek en lees de tabel op een werkblad
Een Excel-werkmap kan meerdere werkbladen, titels en berekende totalen bevatten. Cellen hebben opgeslagen waarden en types, maar ook weergaveopmaak. Om een werkblad in te lezen, zoek je de gegevenstabel en begrijp je welke onderdelen van de werkmap DataFrame-waarden worden.
Kies het werkblad en de grenzen
df = pd.read_excel(
"quarterly.xlsx",
sheet_name="Q1",
skiprows=2,
usecols="A:C",
nrows=2
)
Stel dat rij 1 een samengevoegde titel is, rij 2 leeg is, rij 3 region, date en sales bevat en rijen 4–5 de waarnemingen bevatten. skiprows=2 maakt van rij 3 de kopregel; nrows=2 stopt vóór het totaal in rij 6. Voor North 1200 en South 950 tellen de twee waarnemingen op tot 2150. Als je een opgeslagen totaal van 2150 als derde waarneming opneemt, verdubbelt dat bedrag.
Excel toont rijnummers vanaf 1; rijposities in pandas beginnen bij 0. Ook header=2 selecteert Excel-rij 3 als kopregel. usecols="A,C,E:F" selecteert afzonderlijke kolommen en een bereik. De standaardinstelling sheet_name=0 leest het eerste werkblad; een naam selecteert een specifiek werkblad en sheet_name=1 selecteert het tweede.
sheet_name=None geeft een dictionary terug die werkbladnamen aan DataFrames koppelt. Selecteer een sleutel of doorloop .items() in een lus; de dictionary zelf is niet één DataFrame. Voor meerdere leesbewerkingen uit één werkmap:
with pd.ExcelFile("quarterly.xlsx") as xf:
print(xf.sheet_names)
q1 = pd.read_excel(xf, sheet_name="Q1")
Weet wat de cel werkelijk opslaat
Een percentage dat wordt weergegeven als "15%" slaat 0,15 op. Een getal dat met vijf cijfers wordt weergegeven, kan 2139 opslaan, ook al toont het scherm "02139". Geen enkele inleesoptie kan een nul terughalen die alleen in de opmaak bestaat. Sla identificatiecodes als tekst op in de werkmap en geef bij het inlezen ook dtype={"zip": str} door; anders kan pandas zelfs uit tekstcellen met alleen cijfers gehele getallen afleiden.
De numerieke precisie van Excel is beperkt tot 15 significante cijfers. Een identificatiecode van 16 cijfers die als getal is ingevoerd, kan al beschadigd zijn voordat Python die inleest. Sla zulke waarden op als tekst. Een werkblad heeft maximaal 1.048.576 rijen en 16.384 kolommen, dus een zeer grote dataset heeft een ander formaat nodig.
Ga zorgvuldig om met formules en samengevoegde cellen
pandas berekent geen formules. Het leest opgeslagen resultaten uit de werkmap. Een spreadsheetprogramma kan actuele resultaten opslaan; een door een script gemaakt bestand kan ontbrekende, voorlopige of verouderde opgeslagen resultaten bevatten. openpyxl berekent geen resultaat en XlsxWriter schrijft normaal een nul als plaatsaanduiding, tenzij een waarde wordt opgegeven. Bereken belangrijke waarden opnieuw in pandas of open en sla de werkmap op in een spreadsheetprogramma voordat je op de opgeslagen totalen vertrouwt.
Alleen de cel linksboven in een samengevoegd celbereik slaat het label op. Een samengevoegd landlabel kan daardoor lege waarden in de rijen eronder achterlaten. Als de indeling bevestigt dat het label voor die rijen geldt, vult df["country"] = df["country"].ffill() het naar beneden aan. Inspecteer de tabelgrens voordat je aanvult.
Voor het inlezen is een Excel-bibliotheek nodig. openpyxl verwerkt .xlsx en .xlsm; xlrd verwerkt .xls, pyxlsb verwerkt .xlsb, odf verwerkt .ods en calamine ondersteunt meerdere spreadsheetformaten. Een ontbrekende bibliotheek geeft een ImportError met de naam van de benodigde afhankelijkheid. Kleuren, opmerkingen en andere vormgeving worden niet als DataFrame-gegevens ingelezen.
Belangrijkste punten
- Selecteer het werkblad, de kopregel, kolommen en rijen met waarnemingen expliciet.
sheet_name=Nonegeeft een dictionary met DataFrames terug.- Opgeslagen waarden kunnen verschillen van weergegeven percentages of identificatiecodes met voorloopnullen.
- pandas berekent geen formules; de opgeslagen resultaten kunnen verouderd zijn of ontbreken.
- Samengevoegde labels staan in de cel linksboven.
- Sla lange identificatiecodes als tekst op voordat Excel ze kan afronden.
- Installeer een leesbibliotheek die geschikt is voor het werkmapformaat.
3.2 Schrijf één werkmap met meerdere werkbladen
Excel is handig wanneer mensen een rapport in een spreadsheetprogramma moeten openen en inspecteren. Een DataFrame kan één werkblad worden, of meerdere DataFrames kunnen een werkmap delen. Kies vóór het schrijven het doelpad en de werkbladnamen, zodat elke tabel op de bedoelde plaats terechtkomt.
Schrijf één of meerdere tabellen
weather.to_excel(
"weather.xlsx",
sheet_name="Weather",
index=False
)
index=False houdt de standaardrijnummers buiten het werkblad. Zonder die optie verschijnen ze als een extra eerste kolom en kunnen ze bij later inlezen terugkomen als "Unnamed: 0". Behoud een index alleen als die betekenisvolle labels bevat die in het rapport thuishoren.
Een to_excel-aanroep met een pad schrijft een werkmap op dat pad en vervangt een bestaand bestand. Als je de aanroep één keer voor Weather en daarna voor Counts op hetzelfde pad uitvoert, blijft mogelijk alleen de tweede tabel over. Gebruik één schrijver voor beide:
with pd.ExcelWriter("report.xlsx") as writer:
weather.to_excel(writer, sheet_name="Weather", index=False)
counts.to_excel(writer, sheet_name="Counts", index=False)
De contextmanager sluit en voltooit de werkmap wanneer het blok eindigt. Als je die met pd.read_excel("report.xlsx", sheet_name=None) inleest, krijg je een dictionary met beide werkbladnamen. Voor het schrijven van .xlsx is openpyxl of XlsxWriter nodig.
Werk een werkblad in een bestaande werkmap bij
Gebruik een schrijver in toevoegmodus om één werkblad te vervangen en de andere te behouden:
with pd.ExcelWriter(
"report.xlsx",
mode="a",
engine="openpyxl",
if_sheet_exists="replace"
) as writer:
counts.to_excel(writer, sheet_name="Counts", index=False)
if_sheet_exists bepaalt wat er bij een naamconflict gebeurt. "error" stopt, "new" maakt een ander werkblad, "replace" vervangt dat werkblad en "overlay" schrijft in de bestaande cellen. Bij schrijven over een bestaand werkblad worden oude cellen buiten de nieuwe tabel niet gewist, zodat een kortere update oude rijen kan achterlaten. Bepaal of het rapport een volledige vervanging van het werkblad nodig heeft of zorgvuldig gepositioneerde nieuwe inhoud over bestaande cellen.
Maak de uitvoer gemakkelijk opnieuw te openen
Werkbladnamen mogen maximaal 31 tekens bevatten en mogen geen :, \, /, ?, *, [ of ] bevatten. Een korte naam zoals "Q1 Summary" werkt; "Q1/Q2" bevat een verboden schuine streep. Sommige bibliotheken waarschuwen bij een te lange naam in plaats van te stoppen, dus kies zelf geschikte namen.
startrow en startcol positioneren een tabel met verschuivingen die bij nul beginnen. na_rep geeft ontbrekende waarden een zichtbare markering. float_format="%.2f" rondt geschreven getallen af en autofilter=True voegt in pandas 3 filterknoppen aan de kopregel toe. Datum-tijdkolommen worden als Excel-datums geschreven.
Afronden bij de uitvoer verandert opgeslagen getallen, niet alleen hun weergave. Bewaar een analysebestand met volledige precisie apart wanneer een afgerond rapport nodig is. Open de werkmap opnieuw en controleer de lijst met werkbladen, tabelafmetingen en representatieve waarden. Excel inlezen is relatief langzaam en opslaan en opnieuw inlezen kan pandas-datatypes veranderen, dus gebruik Parquet voor tussentabellen in de analyse wanneer behoud van types belangrijk is.
Belangrijkste punten
- Gebruik één
ExcelWriterom meerdere tabellen in een nieuwe werkmap te plaatsen. - Een schrijfbewerking met een pad vervangt een bestaande werkmap.
- Toevoegmodus en
if_sheet_existsbepalen hoe bestaande werkbladen worden bijgewerkt. - Kies geldige werkbladnamen en controleer de opnieuw geopende werkmap.
4Haal gegevens op uit JSON-bestanden en web-API's
JSON en web-API's leveren records in vormen die niet altijd bij een tabel passen. Je leest en schrijft JSON, kiest een passende tabelindeling en zet geneste objecten of lijsten om in een platte tabel, terwijl je bijhoudt wat elke rij voorstelt. Ook controleer je HTTP-antwoorden, doorloop je pagina's en verwerk je toegangsgegevens en verzoeklimieten, zodat de resulterende dataset de records bevat die je wilde verzamelen.
4.1 JSON-objecten, tabellen en records per regel
JSON slaat geneste gegevens op als tekst. Objecten bevatten naam-waardeparen, arrays bevatten geordende waarden en tekenreeksen gebruiken dubbele aanhalingstekens. De overige waarden zijn getallen, true, false en null. De module json van Python zet deze syntaxis om in Python-objecten voordat je een tabel maakt.
Lees en schrijf geldige JSON
import json
text = '{"station":"Oslo","active":true,"temp_c":[3.5,null,4.0]}'
data = json.loads(text)
print(data["active"]) # True
print(data["temp_c"]) # [3.5, None, 4.0]
Objecten worden dictionaries, arrays worden lijsten en null wordt None. json.loads leest een tekenreeks in; json.load leest een open bestand. De schrijffuncties werken in de omgekeerde richting: json.dumps geeft tekst terug en json.dump schrijft naar een bestand.
with open("station.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
ensure_ascii=False laat tekens zoals "ü" leesbaar. De standaardinstelling kan hetzelfde teken schrijven als \u00fc; beide vormen stellen dezelfde tekenreeks voor. Een afgedrukte Python-dictionary is geen JSON: enkele aanhalingstekens, True, None en afsluitende komma's zijn ongeldige JSON-syntaxis. Standaard-JSON heeft ook geen NaN. De encoder van Python staat dit standaard toe, maar allow_nan=False wijst het af; pandas schrijft ontbrekende waarden als null.
Stem af op de tabelindeling
Een JSON-tabel heeft een oriëntatie nodig: de indeling van rijen, labels en waarden. orient="records" geeft één object per rij:
[{"city":"Lyon","temp_c":21.5},{"city":"Osaka","temp_c":null}]
De standaardoriëntatie voor DataFrames, "columns", groepeert waarden onder kolomnamen en daarna rijlabels. "split" slaat kolommen, index en gegevens afzonderlijk op. Geef een oriëntatie op die bij het ontvangende programma past in plaats van aan te nemen dat elke JSON-tabel dezelfde vorm heeft.
from io import StringIO
import pandas as pd
df = pd.read_json(
StringIO('[{"code":"0042","amount":9.5}]'),
orient="records",
dtype={"code": str}
)
In pandas 3 is een gewone tekenreeks die aan read_json wordt doorgegeven een pad, dus plaats echte JSON-tekst in StringIO. Zelfs uit JSON-tekenreeksen met alleen cijfers kunnen getallen worden afgeleid; het expliciete datatype behoudt "0042".
Gebruik JSON Lines voor opeenvolgende records
JSON Lines heeft één volledig JSON-object per regel, zonder omringende array of komma's tussen records:
{"id":1,"amount":9.5}
{"id":2,"amount":12.0}
Lees het in met pd.read_json(path, lines=True) en schrijf het met df.to_json(path, orient="records", lines=True). De opties chunksize en nrows van de leesfunctie vereisen lines=True, waardoor afzonderlijke records na elkaar beschikbaar komen.
Stel bij het exporteren van datums date_format="iso" in voor leesbare ISO-tijdstempels. pandas 3.1 gebruikt voor gewone DataFrame-uitvoer naar JSON nog standaard milliseconden sinds het epochtijdstip, maar die standaardinstelling verandert. Expliciete datumuitvoer voorkomt dat een leesprogramma moet raden wat een groot geheel getal voorstelt.
Belangrijkste punten
- JSON-syntaxis verschilt van een afgedrukte Python-dictionary.
loadendumpgebruiken bestanden;loadsendumpsgebruiken tekenreeksen.- Kies een oriëntatie die bij de tabelindeling past.
- Plaats JSON-tekst voor
read_jsoninStringIOen behoud de types van identificatiecodes. - JSON Lines gebruikt één object per regel en ondersteunt blokgewijs inlezen.
- Gebruik ISO-datumuitvoer voor leesbare uitgewisselde tijdstempels.
4.2 Kies wat één rij geneste gegevens voorstelt
Geneste JSON kan een bestelling, de klant en meerdere artikelen in één object beschrijven. Bepaal vóór het omzetten naar een platte tabel het detailniveau per rij: wat één rij voorstelt. Dat detailniveau bepaalt welke bedragen je kunt optellen.
Zet eerst geneste objecten om naar een platte tabel
Bekijk twee bestellingen. Bestelling 501 hoort bij Ana en heeft de artikelen A1 (aantal 2, prijs 3,5) en B7 (aantal 1, prijs 10,0). Bestelling 502 hoort bij Ben en heeft A1 (aantal 4, prijs 3,5). De klantgegevens zijn geneste objecten en de artikelen zijn lijsten.
orders = [
{"order_id": 501,
"customer": {"name": "Ana", "country": "PT"},
"items": [{"sku": "A1", "qty": 2, "price": 3.5},
{"sku": "B7", "qty": 1, "price": 10.0}]},
{"order_id": 502,
"customer": {"name": "Ben", "country": "CA"},
"items": [{"sku": "A1", "qty": 4, "price": 3.5}]}
]
order_rows = pd.json_normalize(orders)
Dit levert twee rijen en vier kolommen op: order_id, items, customer.name en customer.country. De geneste klantvelden worden kolommen met namen waarin punten staan. De artikellijsten blijven in cellen; normalisatie zet niet automatisch elke lijst om in rijen.
Vouw een lijst uit met informatie van het bovenliggende object
items = pd.json_normalize(
orders,
record_path="items",
meta=["order_id", ["customer", "name"]]
)
record_path kiest de lijst waarvan de elementen rijen worden. meta kopieert waarden van het bovenliggende object naar elke rij, met een lijst van sleutels voor een genest pad. Het resultaat heeft drie artikelrijen: twee voor Ana's bestelling en één voor die van Ben. De omzet is aantal maal prijs: 7,0; 10,0 en 14,0, samen 31,0.
Als de verzendkosten op bestelniveau 4,00 zijn, worden ze op beide artikelrijen van bestelling 501 herhaald. Als je die herhaalde kosten optelt, krijg je 8,00 voor één bestelling. Bewaar bedragen op bestelniveau in een aparte bestellingentabel als je ook een artikelentabel nodig hebt; behoud order_id om ze te koppelen.
Bepaal namen en verwerk ontbrekende velden
sep="_" maakt namen zoals customer_name. record_prefix="item_" onderscheidt artikelvelden van velden met dezelfde naam in het bovenliggende object. max_level=0 laat geneste dictionaries intact.
Een gewoon genest veld dat bij één record ontbreekt, wordt een ontbrekende waarde in de uitvoerkolom. Een ontbrekend veld dat via meta wordt opgevraagd, geeft standaard KeyError; errors="ignore" staat ontbrekende metadata toe en vult die met NaN. Een ontbrekende lijst die door record_path wordt aangeduid, moet nog steeds worden gecorrigeerd.
Haal API-antwoorden uit hun omhulsel vóór het omzetten
Een API kan een omsluitend object met count, next en results teruggeven. Geef data["results"] door aan pd.json_normalize om de records om te zetten naar een platte tabel. Als je het omsluitende object zelf doorgeeft, wordt één omhullend object genormaliseerd en blijft de resultatenlijst in een cel staan. Houd pagineringsmetadata beschikbaar om latere pagina's op te halen, maar maak de analysetabel uit de werkelijke recordlijst.
Belangrijkste punten
- Bepaal of elke rij een bovenliggend object of een lijstelement voorstelt.
json_normalizevouwt geneste objecten uit;record_pathvouwt een gekozen lijst uit.metaherhaalt velden van het bovenliggende object op elke onderliggende rij.- Bedragen op het bovenliggende niveau kunnen na het uitvouwen van een lijst dubbel worden geteld.
- Zet de records binnen een omsluitend API-object om naar een platte tabel, niet het omhulsel.
4.3 Vraag een volledig en gecontroleerd API-resultaat op
Een web-API ontvangt een HTTP-verzoek bij een eindpunt en geeft een statuscode, headers en een berichtinhoud terug. Veel API's gebruiken JSON als berichtinhoud, maar een succesvol ontvangen antwoord betekent niet dat het de gegevens of alle benodigde records bevat.
Verstuur parameters en controleer het antwoord
import requests
resp = requests.get(
url,
params={"city": "Lima", "units": "metric"},
timeout=10
)
resp.raise_for_status()
data = resp.json()
df = pd.json_normalize(data["results"])
Hier is url het gedocumenteerde eindpunt van de API. params codeert de querytekenreeks, zodat spaties en speciale tekens in waarden correct worden verwerkt. Requests heeft standaard geen wachttijdlimiet. Eén waarde voor de wachttijdlimiet bepaalt de wachttijd voor verbinden en lezen; het is geen uiterste tijd voor het downloaden van het volledige antwoord.
Roep raise_for_status() aan voordat je de berichtinhoud gebruikt. Bij 4xx- en 5xx-antwoorden geeft de methode een HTTP-fout. Een JSON-foutmelding kan met succes worden ingelezen en toch een mislukt verzoek beschrijven; omgekeerd kan een 200-antwoord tekst bevatten die geen JSON is, waardoor resp.json() mislukt. Inspecteer resp.text als het formaat van het antwoord onverwacht is.
| Status | Betekenis om te onderzoeken |
|---|---|
| 200 | Verzoek geslaagd |
| 400 | Verzoekgegevens zijn ongeldig |
| 401 | Toegangsgegevens ontbreken of zijn ongeldig |
| 403 | Toegang is verboden |
| 404 | Opgevraagde bron is niet gevonden |
| 429 | Te veel verzoeken in korte tijd |
| 5xx | Fout aan de serverzijde |
Houd toegangsgegevens apart
Gebruik de authenticatiemethode die de API documenteert. Lees voor een bearer-token een sleutel uit een omgevingsvariabele en stuur die in een header:
import os
key = os.environ["WEATHER_API_KEY"]
headers = {"Authorization": "Bearer " + key}
Houd sleutels buiten opgeslagen code en notebooks. Als een sleutel is gedeeld of aan versiebeheer is toegevoegd, trek die dan in en vervang die. Een sleutel geeft toegang; een getoonde waarde later verbergen maakt het bekend worden niet ongedaan.
Ga door totdat alle pagina's zijn ingelezen
Volg de gedocumenteerde methode van de API voor de volgende pagina, of die nu paginanummers, offsets of een URL voor de volgende pagina gebruikt. Verzamel de records van elke pagina en stop bij de opgegeven eindvoorwaarde. Een totaal van 230 records met 100 per pagina vereist pagina's van 100, 100 en 30. De eerste pagina kan volledig geldig zijn terwijl de dataset onvolledig is.
Vergelijk het verzamelde aantal met een gerapporteerd totaal als dat beschikbaar is. Houd je aan verzoeklimieten: 429 vraagt om wachten vóór een volgend verzoek en Retry-After kan de wachttijd opgeven. Die header kan seconden of een HTTP-datum bevatten. Sla ruwe antwoorden op voor reproduceerbare analyse en om te voorkomen dat je bij elke nieuwe uitvoering dezelfde gegevens downloadt.
Herken andere formaten voor webtabellen
pd.read_html(url) geeft een lijst met DataFrames terug, één voor elke passende HTML-tabel. match="Population" beperkt tabellen op basis van hun tekst. De functie heeft een afhankelijkheid voor het verwerken van HTML nodig, zoals lxml of BeautifulSoup met html5lib. pd.read_xml leest herhaalde XML-elementen als rijen met lxml of parser="etree". Controleer de voorwaarden van een site voordat je gegevens verzamelt en geef de voorkeur aan een officiële download of API als die beschikbaar is.
Belangrijkste punten
- Verstuur querywaarden met
paramsen stel een expliciete wachttijdlimiet in. - Controleer de HTTP-status voordat je de verwachte berichtinhoud verwerkt.
- Bewaar sleutels in omgevingsvariabelen en vervang sleutels die bekend zijn geworden.
- Volg de paginering tot het einde en controleer het verzamelde aantal.
- Houd je aan verzoeklimieten en sla ruwe antwoorden op voor reproduceerbaarheid.
read_htmlgeeft een lijst met tabellen terug; XML heeft een aparte leesfunctie.
5Sla gegevens op in het juiste bestandsformaat
Bij het opslaan van een tabel kies je hoe die hierna wordt gebruikt. Een collega heeft misschien een leesbare CSV of werkmap nodig, terwijl je volgende analyse exacte types en volledige precisie vereist. Je bepaalt de CSV-uitvoer, vergelijkt veelgebruikte uitwisselingsformaten en binaire formaten en gebruikt Parquet voor tabellen met vastgelegde types. Ook selecteer je kolommen en partities tijdens het inlezen en houd je datasetbestanden consistent wanneer meer gegevens worden toegevoegd.
5.1 Schrijf CSV zonder onbedoelde extra gegevens
Een CSV-export moet de waarden behouden die de ontvanger nodig heeft en de gebruikte conventies duidelijk maken. Kies of de rij-index gegevens bevat, hoe ontbrekende waarden verschijnen en of de uitvoer bedoeld is voor precieze analyse of afgeronde weergave.
Kies wat een kolom wordt
df.to_csv("weather_processed.csv", index=False)
Standaard wordt de index geschreven. Voor een tabel met een gewone genummerde index voegt dit een naamloos eerste veld toe; een latere read_csv kan dat tonen als "Unnamed: 0". index=False laat die rijnummers weg. Als de index betekenisvolle labels bevat, behoud die dan en lees de index opnieuw in met index_col=0.
Ontbrekende waarden worden normaal lege velden. na_rep="NA" maakt ze zichtbaar, maar de ontvangende leesfunctie moet die markering correct interpreteren. In een stedentabel met Lyon op 21,5 °C en Osaka op 18,25 °C moet een ontbrekende neerslagwaarde voor Osaka onderscheiden blijven van nul neerslag.
Stem af op de tekstconventie van de ontvanger
df.to_csv(
"weather_export.csv",
index=False,
sep=";",
decimal=",",
na_rep="NA",
date_format="%Y-%m-%d",
encoding="utf-8"
)
De opties voor het scheidingsteken en decimaalteken leveren waarden op zoals Lyon;21,5;0,0. ISO-datumuitvoer houdt dag en maand ondubbelzinnig. Gebruik encoding="utf-8-sig" als een ontvangend spreadsheetprogramma een BOM nodig heeft om UTF-8 te herkennen.
float_format="%.1f" schrijft één decimaal. De waarde 18,25 wordt bij deze opmaak "18.2" en de verloren precisie kan niet uit de CSV worden teruggehaald. Behoud volledige precisie voor analysegegevens; maak zo nodig een apart afgerond rapport.
Controleer wat behouden blijft bij opslaan en opnieuw inlezen
CSV slaat tekens op zonder metadata over pandas-datatypes. Bekijk vier kolommen: een identificatiecode "02139", een datum-tijdwaarde, een geordende categorische variabele A < B < C en gehele getallen met ondersteuning voor ontbrekende waarden en een ontbrekende waarde. Bij standaard inlezen van CSV kun je het gehele getal 2139, datumtekst, gewone categorielabels zonder hun volgorde en drijvendekommagetallen voor de tellingen terugkrijgen.
Als het inlezen slaagt, betekent dat dus niet noodzakelijk dat het oorspronkelijke DataFrame is hersteld. Bewaar de opties die nodig zijn om de gegevens te reconstrueren, waaronder tekstuele identificatiecodes, het inlezen van datums en markeringen voor ontbrekende waarden. Ook de categorievolgorde moet opnieuw worden gedefinieerd. Voor herhaalde analyse waarbij deze types belangrijk zijn, kan Parquet ze direct behouden.
Voeg records toe en bescherm ruwe invoer
df.to_csv(
"daily_results.csv",
mode="a",
header=False,
index=False
)
Dit voegt rijen toe aan een bestaand bestand. Houd de kolomvolgorde en conventies consistent met dat bestand. Met header=True schrijft een toevoeging nog een kopregel in het midden en kan de volgende leesfunctie die als record behandelen. Schrijf bij een nieuw bestand de kopregel één keer voordat je later rijen toevoegt.
Bewaar ontvangen of gedownloade bestanden ongewijzigd op een locatie voor ruwe gegevens. Schrijf afgeleide resultaten afzonderlijk onder beschrijvende namen. Controleer bij het opnieuw openen van een verwerkte export het aantal rijen, de kolommen, ontbrekende waarden en representatieve waarden, waaronder voorloopnullen en datums.
Belangrijkste punten
- Laat een standaardrij-index weg met
index=False. - Kies markeringen voor ontbrekende waarden, tekencodering en getalnotaties voor de ontvanger.
- Afronden bij de uitvoer verwijdert precisie blijvend.
- Bij opslaan als CSV en opnieuw inlezen zijn expliciete inleesopties nodig om types te herstellen.
- Voeg rijen toe zonder herhaalde kopregels en houd ruwe bestanden ongewijzigd.
5.2 Kies een formaat voor het volgende gebruik
Het beste opslagformaat hangt af van wie de gegevens hierna leest en wat bij de uitwisseling behouden moet blijven. Een tabel voor een collega, een genest API-antwoord en een analysedataset met vastgelegde types hebben verschillende behoeften.
Vergelijk tekstuele en binaire opslag
Tekstformaten coderen zichtbare tekens. CSV is gemakkelijk te inspecteren en wordt breed ondersteund; JSON geeft geneste objecten en arrays op natuurlijke wijze weer. CSV heeft geen schema met kolomtypes en gewone JSON-waardetypes behouden niet elk pandas-datatype. Opnieuw inlezen vereist verwerking van de tekst en kan expliciete typekeuzes nodig maken.
Binaire formaten coderen gegevens zodat software die rechtstreeks kan lezen. Formaten zoals Parquet en Feather slaan een schema op dat kolommen en types beschrijft, waardoor het minder nodig is types opnieuw af te leiden. Ondersteuning voor types hangt nog steeds af van het formaat en de leesfunctie: willekeurige Python-objecten worden niet zomaar uitwisselbaar omdat het bestand binair is.
Een rijgeoriënteerde indeling houdt de velden van een record bij elkaar. Een kolomgeoriënteerde indeling houdt waarden uit dezelfde kolom bij elkaar. Bij analyse zijn vaak enkele kolommen van veel rijen nodig, zodat kolomgeoriënteerde leesfuncties onnodige kolommen kunnen overslaan. Vergelijkbare aangrenzende waarden laten zich ook goed comprimeren. Bestandsgrootte en snelheid hangen af van de gegevens; een compressieresultaat voor één tabel is geen vaste verhouding voor alle tabellen.
Kies voor elke taak een passend formaat
| Formaat | Een geschikte taak | Belangrijkste aandachtspunt |
|---|---|---|
| CSV | Eenvoudige tabeluitwisseling | Types reconstrueren bij het inlezen |
| Excel | Rapporten voor gebruik in spreadsheets | Indeling en spreadsheetlimieten zijn van belang |
| JSON | Geneste records en webdiensten | Kies de object- en tabelindeling |
| Parquet | Opgeslagen analysedatasets | Types vastgelegd, kolomgeoriënteerd, gecomprimeerd en breed ondersteund |
| Feather | Snelle uitwisseling van DataFrames | Opslag op basis van Arrow voor geschikte hulpmiddelen |
| pickle | Eigen tijdelijke Python-objecten | Vertrouwen en versiecompatibiliteit zijn van belang |
| HDF5 | Meerdere grote wetenschappelijke datasets | Hiërarchische organisatie; PyTables voor pandas |
| Database | Gedeelde query's en updates | Verbindingen, rechten en transacties |
Parquet is een open formaat dat wordt gebruikt door pandas, R, Spark en DuckDB. Feather gebruikt Arrow IPC en is handig voor snelle uitwisseling tussen Python en R of tussen lokale stappen. to_feather en read_feather bieden die mogelijkheid. HDF5 groepeert meerdere datasets in één bestand; to_hdf van pandas vereist PyTables.
Begrijp de vertrouwensgrens van pickle
pickle kan Python-objecten buiten gewone tabellen opslaan, maar bij het inlezen kan code worden uitgevoerd. Lees nooit een pickle van een onbetrouwbare bron in. Gebruik het voor je eigen tijdelijke objecten en verwacht compatibiliteitsbeperkingen als Python en bibliotheken veranderen. Zo ondersteunt pandas 3 het lezen van pickles die met pandas-versies van vóór 1.0 zijn gemaakt niet meer.
Beslis op basis van het gewenste resultaat
Als een ontvanger een kleine tabel zonder speciale hulpmiddelen moet inspecteren, is CSV praktisch. Gebruik Excel als de ontvanger benoemde werkbladen nodig heeft. Kies Parquet als je identificatiecodes, categorieën en types met ondersteuning voor ontbrekende waarden tussen analysesessies moet behouden. Als meerdere programma's gedeelde records moeten bevragen en bijwerken, past een database beter dan kopieën van een bestand rondsturen. De formaatkeuze volgt uit het volgende gebruik, niet uit de extensie van de oorspronkelijke invoer.
Belangrijkste punten
- Kies een formaat op basis van de ontvanger, gegevensstructuur en het vereiste behoud van types.
- Kolomgeoriënteerde formaten ondersteunen het inlezen van geselecteerde kolommen en effectieve compressie.
- Parquet is geschikt voor opgeslagen analysetabellen; Excel voor spreadsheetrapporten.
- Feather ondersteunt snelle uitwisseling; HDF5 groepeert wetenschappelijke datasets.
- Pickles uit onbetrouwbare bron kunnen bij het inlezen code uitvoeren.
- Databases ondersteunen gedeelde query's en updates.
5.3 Bewaar tabellen met vastgelegde types in Parquet
Parquet slaat een tabel met de kolomtypes op in een open, kolomgeoriënteerd formaat. Dit is handig wanneer een gecontroleerd DataFrame herhaaldelijk wordt ingelezen of aan andere analysehulpmiddelen wordt doorgegeven. pandas gebruikt PyArrow voor de onderstaande voorbeelden.
Schrijf en controleer een tabel met vastgelegde types
df.to_parquet("sales.parquet", engine="pyarrow")
restored = pd.read_parquet("sales.parquet", engine="pyarrow")
print(restored.dtypes)
Een tekstuele identificatiecode "02139", een datum-tijdkolom, een geordende categorische variabele en gehele getallen met ondersteuning voor ontbrekende waarden kunnen bij deze opslag van pandas via PyArrow en terug naar pandas allemaal met hun types behouden blijven. Anders dan bij het inlezen van CSV hoeft pandas de functie van de identificatiecode niet te raden of de categorievolgorde opnieuw te maken. Inspecteer types en representatieve waarden wanneer je een nieuwe schrijf- of leesfunctie gaat gebruiken.
De standaardinstelling index=None slaat een RangeIndex compact op als metadata. Een andere index wordt als kolommen geschreven en bij het inlezen hersteld. Gebruik index=False als de index niet nodig is. Die keuze gaat over rijlabels, los van de gewone kolommen van de tabel.
Lees minder in en kies compressie
small = pd.read_parquet(
"sales.parquet",
columns=["zip", "amount"]
)
De leesfunctie kan alleen die kolommen uit de opslag ophalen. Dat verschilt van de volledige tabel inlezen en daarna selecteren: dan heb je de volledige leestijd al besteed. Kolomselectie is vooral handig voor brede tabellen.
Snappy is de standaardcompressiecodec. compression="zstd" of "gzip" kost vaak meer schrijfwerk maar levert kleinere bestanden op, terwijl compression=None ongecomprimeerde gegevens schrijft. Meet de afweging met representatieve gegevens; herhaalde labels en willekeurige metingen worden niet op dezelfde manier gecomprimeerd. Installeer PyArrow; de alternatieve fastparquet-engine is in pandas 3.1 verouderd.
Deel een dataset in partities in
df.to_parquet(
"sales_dataset",
engine="pyarrow",
partition_cols=["year"],
index=False
)
recent = pd.read_parquet(
"sales_dataset",
filters=[("year", "==", 2026)]
)
De bestemming is een map met submappen zoals year=2025 en year=2026. Als je de map inleest, wordt de dataset geladen; een filter kan niet-relevante partities overslaan. Bij deze indeling leidt PyArrow de waarden voor year af uit mapnamen en ontvangt pandas de partitiekolom doorgaans als categorische kolom.
Kies een partitiekolom met een kleine verzameling bruikbare waarden waarop je vaak filtert. Een unieke record-ID maakt duizenden kleine partities, wat meer werk voor bestanden en mappen oplevert. Een jaar of een kleine verzameling regio's biedt vaak een praktischere indeling.
Voeg gegevens toe zonder de dataset te beschadigen
Eén Parquet-bestand ondersteunt via pandas geen toevoeging van rijen zoals CSV. Schrijf nieuwe bestanden of partities naar de datasetmap, of lees, combineer en herschrijf één bestand. Bestanden in dezelfde dataset hebben compatibele gegevensschema's nodig. Als het ene bestand een code als tekst opslaat en het andere als geheel getal, kan het inlezen mislukken of kunnen waarden worden geconverteerd. Stel consistente datatypes in voordat je elk deel schrijft en controleer of een toegevoegde partitie geen overlappende kopieën van dezelfde records maakt.
Belangrijkste punten
- Parquet behoudt ondersteunde kolomtypes bij gebruik van compatibele leesfuncties.
columnsleest alleen benodigde kolommen;filtersbeperkt de gegevens tot passende waarden.- De opslag van de index wordt afzonderlijk van gewone kolommen bepaald.
- Partitioneer op enkele waarden waarop je vaak filtert en vermijd kleine bestanden.
- Voeg datasetbestanden met compatibele gegevensschema's toe; voeg geen bytes toe aan één bestand.
6Lees gegevens uit SQL-databases en schrijf er gegevens naartoe
Bij het werken met databases maak je twee keuzes: welk resultaat je opvraagt en welke wijziging je opslaat. Je opent en sluit verbindingen, leest gegeven SQL-query's in pandas in en bindt veranderende waarden zonder de querystructuur te wijzigen. Daarna bepaal je de resultaattypes en blokgrootte, kies je een modus om naar een tabel te schrijven en controleer je het effect, waaronder het verschil tussen volledig opnieuw inlezen en herhaald toevoegen.
6.1 Open een databaseverbinding en lees een resultaat in
Een relationele database slaat records op in tabellen met benoemde kolommen. Een programma verstuurt een SQL-query via een verbinding en ontvangt een resultaat dat pandas kan omzetten in een DataFrame. De database kan alleen de benodigde gegevens selecteren voordat ze naar Python worden verstuurd.
Begin met een SQLite-bestand
import sqlite3
import pandas as pd
con = sqlite3.connect("shop.db")
try:
df = pd.read_sql_query(
"SELECT region, amount FROM sales", con
)
finally:
con.close()
SQLite werkt zonder afzonderlijke server en slaat een database op in een bestand. Bij het verbinden wordt het bestand aangemaakt als het niet bestaat, dus een verkeerd getypt pad kan een nieuwe, lege database openen in plaats van de bedoelde. ":memory:" maakt een tijdelijke database in het geheugen. De bovenstaande query geeft de kolommen region en amount uit een bestaande tabel sales terug; de kolomnamen van het resultaat worden DataFrame-labels.
Een with-blok van een SQLite-verbinding beheert een transactie, maar sluit de verbinding niet. Roep expliciet close() aan als je klaar bent. Een try/finally-blok sluit de verbinding ook als het inlezen een fout geeft.
Gebruik een engine voor een serverdatabase
SQLAlchemy biedt engines voor systemen zoals PostgreSQL, MySQL en SQL Server, met een bijbehorend geïnstalleerd stuurprogramma. Een verbindings-URL geeft het dialect, stuurprogramma, de server en database aan. Bewaar die URL in een omgevingsvariabele:
import os
from sqlalchemy import create_engine
engine = create_engine(os.environ["ANALYSIS_DB_URL"])
try:
with engine.connect() as conn:
df = pd.read_sql_query(
"SELECT region, amount FROM sales", conn
)
finally:
engine.dispose()
De verbindingscontext geeft de verbinding terug aan de verbindingenpool van de engine. dispose() geeft de middelen in de pool vrij wanneer de engine niet meer nodig is. Gebruik voor analyse een account met alleen leesrechten en houd toegangsgegevens buiten notebooks en versiebeheer. Een engine-URL voor een lokaal SQLite-bestand kan "sqlite:///shop.db" zijn.
Kies de leesfunctie die bij de invoer past
| Leesfunctie | Invoer |
|---|---|
read_sql_query | Een SQL-query en verbinding |
read_sql_table | Een tabelnaam en SQLAlchemy-verbinding of -engine |
read_sql | Een query of, bij ondersteunde verbindingen, een tabelnaam |
Geef bij een gewone sqlite3-verbinding een volledige query door. pd.read_sql("sales", con) verstuurt sales als SQL en mislukt; gebruik in plaats daarvan pd.read_sql_query("SELECT * FROM sales", con). pandas ondersteunt SQLAlchemy-, ADBC- en SQLite-verbindingen; een willekeurige rechtstreekse verbinding via een stuurprogramma is geen ondersteund alternatief enkel omdat het stuurprogramma SQL kan uitvoeren.
Verplaats het resultaat dat je nodig hebt
Een query die geselecteerde rijen en kolommen teruggeeft, draagt minder gegevens over dan een hele tabel inlezen en het grootste deel in pandas weggooien. De gegeven query SELECT SUM(amount) AS total FROM sales geeft één aggregatiewaarde terug, met het label total. Het inlezen van een queryresultaat verandert de opgeslagen tabel niet. Controleer na het inlezen het aantal rijen en de types, net als bij een bestand; de gedeclareerde databasetypes en de teruggegeven pandas-types hangen samen maar zijn niet identiek.
Belangrijkste punten
- SQLite is een lokale bestandsdatabase; serverdatabases hebben een verbinding en stuurprogramma nodig.
- Gebruik volledige query's met een gewone SQLite-verbinding.
- Laat een query de rijen en kolommen beperken die naar pandas worden overgedragen.
- Houd toegangsgegevens apart en gebruik voor analyse alleen leestoegang.
- Sluit SQLite-verbindingen en geef SQLAlchemy-middelen vrij.
6.2 Houd querywaarden gescheiden van SQL
Veranderende waarden horen in queryparameters. De SQL-instructie bepaalt de bewerking; gebonden parameters leveren de regio, grenswaarde of andere waarde die voor deze uitvoering wordt gebruikt. Zo blijft de querystructuur behouden, ook als een waarde een aanhalingsteken bevat.
Bind waarden met de syntaxis van de verbinding
Voor SQLite:
query = "SELECT region, amount, sold_on FROM sales WHERE amount > ? ORDER BY amount DESC"
df = pd.read_sql_query(query, con, params=(70,))
Voor de verkoopbedragen 120,0, 75,5, 60,0 en 210,0 geeft dit 210,0, 120,0 en 75,5 terug in aflopende volgorde. De tuple (70,) heeft één element; (70) is alleen het getal 70. SQLite accepteert ook benoemde plaatsaanduidingen, bijvoorbeeld WHERE region = :r met params={"r": "North"}.
De regels voor plaatsaanduidingen hangen af van de interface. psycopg gebruikt %s of %(name)s. Met SQLAlchemy plaats je een instructie in text en gebruik je benoemde parameters:
from sqlalchemy import text
query = text("SELECT region, amount FROM sales WHERE amount >= :m")
with engine.connect() as conn:
df = pd.read_sql_query(query, conn, params={"m": 100})
Geef waarden door via params; gebruik geen Python-opmaak om ze in de instructie in te voegen.
Begrijp waartegen parametrisering beschermt
Stel dat code een voorwaarde bouwt met een f-string en de invoer "x' OR '1'='1". Als je die tussen aanhalingstekens plakt, verandert de voorwaarde in region = 'x' OR '1'='1', die op elke rij van toepassing is. Dit is SQL-injectie: een waarde is uitvoerbare querystructuur geworden.
Een gebonden parameter wordt als één waarde vergeleken, zodat dezelfde tekenreeks alleen overeenkomt met een regio die letterlijk die tekst heeft. Binden verwerkt ook gewone namen met apostroffen zonder dat je zelf escapes voor aanhalingstekens hoeft te maken. De regel geldt voor invoer uit bestanden én uit gebruikersformulieren.
Parameters vertegenwoordigen waarden, geen tabel- of kolomnamen. Een parameter op de plaats van een tabelnaam selecteert die tabel niet. Als een programma een variabele identificatie nodig heeft, kies die dan uit een vaste lijst die door de code wordt beheerd.
Bepaal de types in het resultaat
SQLite slaat datums vaak op als tekst. Vraag pandas om ze als datums in te lezen:
df = pd.read_sql_query(
"SELECT sold_on, visits FROM observations", con,
parse_dates=["sold_on"],
dtype={"visits": "Int64"}
)
De datumkolom krijgt datum-tijdwaarden en een telling met SQL NULL gebruikt gehele getallen met ondersteuning voor ontbrekende waarden, in plaats van alleen daarvoor drijvendekommagetallen te worden. Inspecteer het resultaat om de conversie te controleren.
Onderscheid gegevensblokken van buffering door het stuurprogramma
chunksize=1000 geeft een iterator van DataFrames terug die elk maximaal 1.000 rijen bevatten. Een resultaat van vier rijen geeft met chunksize=3 delen van drie en één rij. Houd de verbinding open terwijl je ze verwerkt. Sommige databasestuurprogramma's bufferen nog steeds het hele resultaat voordat pandas blokken oplevert; een cursor aan de serverzijde of een streaminginstelling kan ook nodig zijn om het geheugenverbruik over het volledige verbindingstraject te beperken.
Belangrijkste punten
- Bind veranderende waarden via
paramsmet de stijl voor plaatsaanduidingen van de interface. - Een positionele tuple met één waarde heeft een afsluitende komma nodig.
- Parameters voorkomen dat een waarde de querystructuur verandert.
- Kies variabele tabel- en kolomnamen uit een vaste, toegestane lijst.
- Lees datums als datums in en vraag expliciet om resultaattypes voor gehele getallen met ondersteuning voor ontbrekende waarden.
- De blokgrootte in pandas bepaalt niet hoe het stuurprogramma gegevens buffert.
6.3 Schrijf tabellen en controleer de bedoelde wijziging
to_sql maakt een databasetabel uit een DataFrame of schrijft rijen naar een bestaande tabel. De opties bepalen of bestaande gegevens behouden blijven, of de index een kolom wordt en hoe een groep schrijfbewerkingen wordt bevestigd.
Kies het gedrag bij een bestaande tabel
df.to_sql("sales", con, index=False)
De standaardinstelling if_exists="fail" stopt als sales al bestaat. Kies alleen een andere modus als het effect past bij de bedoelde invoer:
| Modus | Gedrag bij bestaande tabel |
|---|---|
fail | Stoppen zonder gegevens in die tabel in te voegen |
append | Rijen toevoegen aan de bestaande inhoud |
replace | De tabel verwijderen en opnieuw maken |
delete_rows | Alle rijen verwijderen, de tabel behouden en daarna invoegen |
delete_rows is beschikbaar in pandas 3. Een tabel vervangen verwijdert de oude definitie, inclusief sleutels, indexen en beperkingen; ook databasespecifieke rechten kunnen worden beïnvloed. Rijen verwijderen behoudt de definitie, maar wist nog steeds elk bestaand record. Gebruik dit als je de tabel volledig opnieuw wilt vullen, niet als het DataFrame alleen een nieuwe groep records bevat.
Stel kolommen in en schrijf binnen een transactie
Standaard wordt de DataFrame-index als kolom geschreven. Een naamloze index wordt index; een benoemde index behoudt zijn naam. index_label geeft de index een expliciete naam en index=False sluit die uit. Als een ID al een gewone kolom is, voegt het schrijven van standaardrijnummers meestal geen bruikbare informatie toe.
Met SQLAlchemy kan dtype databasetypes kiezen:
from sqlalchemy import types
with engine.begin() as conn:
df.to_sql(
"sales", conn,
if_exists="append",
index=False,
dtype={"sold_on": types.Date()},
chunksize=1000
)
engine.begin() bevestigt de transactie bij succesvolle afsluiting en draait die terug bij een uitzondering. Voor een bestaande tabel bepaalt het opgeslagen gegevensschema nog steeds welke waarden kunnen worden ingevoegd; dtype is geen opdracht om de kolommen opnieuw te ontwerpen. Transactiegaranties hangen ook af van de ondersteuning van de database voor de gebruikte bewerkingen. Toevoegen binnen een SQLAlchemy-transactie houdt de invoegbewerking van het voorbeeld bij elkaar.
chunksize groepeert rijen in partijen. method="multi" plaatst meerdere rijen in één INSERT-instructie waar dat wordt ondersteund. Dit kan de prestaties verbeteren of verslechteren, afhankelijk van de database en partijgrootte, dus meet dit met representatieve gegevens.
Controleer de groei, niet alleen de voltooiing
check = pd.read_sql_query("SELECT COUNT(*) AS n FROM sales", con)
print(check["n"].iloc[0])
Vergelijk voor een nieuwe of volledig opnieuw gevulde tabel het aantal met len(df). Vergelijk bij toevoegen de toename: een tabel met vier rijen die twee rijen erbij krijgt, moet er zes bevatten. Het aantal rijen dat to_sql teruggeeft, komt uit de rapportage van het stuurprogramma; controleer de opgeslagen gegevens rechtstreeks.
Als je toevoegen twee keer uitvoert, worden de records herhaald, tenzij de database duplicaten afwijst of het programma alleen nieuwe records selecteert. Bepaal voordat je de bewerking opnieuw uitvoert of het gaat om een tabel volledig opnieuw vullen of het toevoegen van nieuwe records. Een transactie voorkomt een gedeeltelijke invoer bij een fout; die maakt herhaald succesvol toevoegen niet uniek.
Belangrijkste punten
appendvoegt rijen toe;replaceverwijdert de tabel;delete_rowsbehoudt de definitie.- Gebruik
index=False, tenzij de index bij de opgeslagen gegevens hoort. - Gebruik een SQLAlchemy-transactie om een invoer als geheel te bevestigen of terug te draaien.
- Controleer toevoegen aan de hand van de verwachte toename van opgeslagen rijen.
- Een succesvolle toevoeging herhalen kan records dupliceren.
- De prestaties van partijen en INSERT-instructies met meerdere rijen hangen af van de database.
Gegevens inlezen en opslaan: voorbeelden
1Maak een betrouwbare tabel uit tekst
17 stappen
- 1IntroductieLees de structuur vóór de waarden
Een tekstexport laat belangrijke keuzes aan de lezer over. Een komma kan velden scheiden of binnen een naam tussen aanhalingstekens voorkomen; een getal kan een meting of een identificatiecode zijn.
Je bepaalt eerst de records en kolommen, interpreteert daarna hun waarden en verwijdert ten slotte rapportmateriaal buiten de tabel. Inspecteer het resultaat na elke keuze, zodat succesvol inlezen geen gewijzigde gegevens verhult.
- 2VoorbeeldLees drie verkooprecords in
Het verkoopbestand heeft een kopregel en drie waarnemingen:
order_id,date,region,units,price 1001,2026-03-02,North,3,4.50 1002,2026-03-02,South,1,12.00 1003,2026-03-03,North,2,7.25df = pd.read_csv("sales.csv")levert vorm(3, 5)op.unitsis een kolom met gehele getallen enpricebevat drijvendekommagetallen. De tekenreeksen die op datums lijken, moeten nog als datums worden ingelezen. - 3UitlegGeef elke inspectie een doel
Gebruik
head()om te controleren of velden onder de bedoelde namen staan,shapeom afmetingen te vergelijken endtypesom de interpretatie te inspecteren.info()voegt aantallen aanwezige waarden toe.Als een numerieke kolom tekst is, inspecteer dan ruwe waarden op markeringen of getalnotaties. Als een bestand niet wordt gevonden, controleer dan de huidige werkmap: kolomopties veranderen kan een relatief pad naar de verkeerde locatie niet herstellen.
- 4UitdagingBehoud de eerste waarneming
Een bestand zonder kopregel begint met
V12,South,6en heeft 40 waarnemingen. Standaard inlezen geeft 39 rijen met die drie waarden als labels. Welke wijziging bij het inlezen behoudt alle waarnemingen en geeft bruikbare namen?---reveal---
Gebruik
header=None, names=["site", "region", "units"]. Het eerste record blijft gegevens, dus de verwachte vorm is(40, 3). Als je vervangende namen opgeeft metheader=0, wordt dat eerste record nog steeds gebruikt als kopregel. - 5KernpuntAanhalingstekens bepalen de veldgrens
Het record
"Smith, Jane",Boston,10heeft drie velden. De komma binnen de aanhalingstekens maakt deel uit van de naam. Een dubbel aanhalingsteken binnen een veld tussen aanhalingstekens stelt één letterlijk aanhalingsteken voor.Velden tussen aanhalingstekens kunnen ook een regeleinde bevatten. Laat
read_csvrecords interpreteren: elke fysieke regel op komma's splitsen kan zowel onjuiste kolommen als onjuiste records maken. - 6VoorbeeldHerken drie verschillende symbolen
De productexport bevat
Tea;3,50;1.200. Een puntkomma scheidt de velden, een komma markeert het decimale deel van de prijs en een punt groepeert de cijfers van het aantal.df = pd.read_csv( "products.csv", sep=";", decimal=",", thousands="." )De waarden worden prijs 3,5 en aantal 1200. De optie voor het scheidingsteken alleen legt de getalnotatie niet vast.
- 7UitdagingSpoor een onopgemerkte schaalfout op
Een export met puntkomma's vermeldt dat aantallen hele eenheden zijn. Het ruwe aantal is
"6.400", maar bij inlezen met alleensep=";"krijg je 6,4. Welke getaloptie en verwachte waarde herstellen de interpretatie?---reveal---
Gebruik
thousands="."om de punt als scheidingsteken voor duizendtallen te interpreteren. Dat levert 6400 op. De waarde 6,4 is numeriek geldig als de punt als decimaalteken wordt geïnterpreteerd, dus voor deze fout hoeft geen uitzondering op te treden. Vergelijk ingelezen waarden met de bron. - 8TipStem de parser af op de benodigde opties
De gebruikelijke C-parser verwerkt veelvoorkomende bestanden snel. De Python-parser ondersteunt detectie van scheidingstekens, algemene reguliere expressies als scheidingsteken en het overslaan van afsluitende rapportregels.
sep=Nonekan een scheidingsteken detecteren, maar kan bij onregelmatige rapporten verkeerd kiezen.Geef een scheidingsteken dat je al kent op. Kies
engine="python"als jeskipfootergebruikt; de PyArrow-parser heeft eigen beperkingen, waaronder het ontbreken van ondersteuning voorchunksize. - 9VoorbeeldMaak markeringen voor ontbrekende waarden kolomspecifiek
De scorewaarden zijn 88,
"n/a","-"en 999. De laatste twee zijn gedocumenteerde markeringen voor ontbrekende waarden.df = pd.read_csv( "scores.csv", na_values={"score": ["-", "999"]} )De score wordt 88,0 gevolgd door drie ontbrekende waarden. Beperk de regel tot
score, zodat een geldige 999 in een andere kolom gegevens blijft. Een niet-opgegeven signaalwaarde kan totalen en gemiddelden vertekenen. - 10UitlegBehoud codes en interpreteer datums
Een identificatiecode zoals
"00501"moet als tekst worden opgeslagen, terwijl tellingen met ontbrekende waarden"Int64"kunnen gebruiken. Ook datums hebben een eigen interpretatie nodig.df = pd.read_csv( "visits.csv", dtype={"code": str, "visits": "Int64"}, parse_dates=["day"], date_format="%d/%m/%Y" )Het expliciete patroon maakt van
"03/04/2026"3 april. Inspecteer daarna de datatypes om te bevestigen dat de gevraagde conversie werkelijk heeft plaatsgevonden. - 11UitdagingBehoud een echt label en een ontbrekende waarde
In een CSV is zone
"NA"een echt label. Een leeg veld voorvisitsbetekent ontbrekend en de bekende tellingen zijn gehele getallen. Welke keuzes voor ontbrekende waarden en types behouden die betekenissen?---reveal---
Gebruik
keep_default_na=False, na_values={"visits": [""]}, dtype={"visits": "Int64"}. Het zonelabel blijft behouden, terwijl lege bezoekvelden ontbrekende waarden in een kolom met gehele getallen worden. Als je de standaardmarkeringen ingeschakeld laat, wordt ook het echte label"NA"verwijderd. - 12VoorbeeldZoek de tabel in het rapport
Een rapport heeft drie regels vóór de kopregel, een
#-commentaarregel in het midden en daarna waarnemingen gevolgd door een totaal en een bronvermelding.df = pd.read_csv( "report.csv", skiprows=3, comment="#", skipfooter=2, engine="python" )De titelregels, het commentaar en de afsluitende rapportregels worden uitgesloten. Als de waarnemingen voor januari optellen tot 218, zou het behouden van een totaalrij met 218 de kolomsom onjuist op 436 brengen.
- 13KernpuntNiet elk onjuist record geeft een fout
Extra velden kunnen een fout voor een onjuist opgebouwde regel veroorzaken. Te weinig velden kunnen daarentegen ontbrekende waarden aan het einde opleveren: onder
id,name,scorewordt het record2,Benzonder score ingelezen.Als je onjuist opgebouwde records overslaat, verwijder je ook hun waarnemingen. Controleer aantallen rijen en ontbrekende waarden afzonderlijk en onderzoek een verkeerd scheidingsteken of een veld zonder benodigde aanhalingstekens voordat je besluit records te verwijderen.
- 14UitdagingHoud de posities uit elkaar
Een export met vaste veldbreedtes kent posities 0–2 toe aan een code, 3–9 aan een naam en 10–14 aan een waarde. Welke
colspecspassen bij die velden?---reveal---
Gebruik
[(0, 3), (3, 10), (10, 15)]. Elk bereik omvat het begin en sluit het einde uit, wat breedtes van 3, 7 en 5 geeft. Als je eindpunten 2, 9 en 14 zou gebruiken, valt het laatste teken van elk veld weg omdat die eindpunten zijn uitgesloten. - 15UitlegKies labels met niveaus of platte labels
Als twee kopregels groepen en jaren beschrijven, maakt
header=[0, 1]kolomlabels met twee niveaus. Een verkoopkolom kan dan worden aangeduid met("sales", "2026").Als de analyse gewone platte namen nodig heeft, sla dan beide kopregels over en geef namen op zoals
"region","sales_2025"en"sales_2026". Controleer of geen van beide kopregels bij de waarnemingen is blijven staan. - 16UitdagingCombineer keuzes voor indeling en waarden
Een export heeft één titelregel en daarna de kopregel
code;amount;day. Een record is00018;2.100,50;11/12/2026. Bedragen gebruiken punten voor duizendtallen en decimale komma's; bij datums komt de dag eerst. Geef de belangrijkste inleesopties op.---reveal---
Gebruik
skiprows=1, sep=";", thousands=".", decimal=",", dtype={"code": str}, parse_dates=["day"], date_format="%d/%m/%Y". Het record behoudt code"00018", bedrag 2100,5 en 11 december als datum. - 17SamenvattingControleer de betekenis van de ingelezen gegevens
Stem eerst recordgrenzen, kopregels en tabelgrenzen af. Stel daarna getalnotaties, markeringen voor ontbrekende waarden, identificatietypes en datums in.
Inspecteer afmetingen en types, vergelijk geselecteerde ruwe waarden en controleer ontbrekende waarden en totalen. Een parser kan met succes eindigen terwijl een voorloopnul verloren gaat, een datum wordt verwisseld of een rapporttotaal als waarneming wordt geteld. Deze controles laten zien of de ingelezen tabel dezelfde betekenis heeft als het bestand.
2Decodeer tekst en verwerk die in delen
13 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieTwee afzonderlijke inleesproblemen
- 2VoorbeeldVolg een teken naar bytes
- 3UitlegGebruik markeringen en documentatie
- 4UitdagingInterpreteer de bestandsmarkering
- 5VoorbeeldHerstel de oorspronkelijke interpretatie
- 6TipWis onleesbare tekens niet
- 7UitdagingKies aanwijzingen boven het ontbreken van fouten
- 8UitlegMeet de ingelezen tabel
- 9VoorbeeldHoud een cumulatieve som en telling bij
- 10UitdagingWeeg waarnemingen even zwaar
- 11KernpuntCompressie en blokgewijs verwerken beperken verschillende kosten
- 12UitdagingBehoud het geheugenvoordeel
- 13SamenvattingHoud bytes en deelresultaten betrouwbaar
3Lees een werkmap en maak een helder rapport
11 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieScheid de tabel van de presentatie
- 2VoorbeeldSelecteer de waarnemingen in Q1
- 3UitlegLees de opgeslagen waarde
- 4KernpuntEen formule is geen verzoek om te rekenen
- 5UitdagingVerklaar twee verdachte cellen
- 6TipControleer de verzameling werkbladen
- 7VoorbeeldSchrijf twee werkbladen via één schrijver
- 8UitlegKies hoe een bestaand werkblad verandert
- 9UitdagingVoorkom achtergebleven rijen
- 10UitdagingMaak een rapport uit meerdere bronwerkbladen
- 11SamenvattingControleer de werkmap aan beide kanten
4Zet API-records om in een tabel met het juiste detailniveau
16 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieVan antwoordtekst naar waarnemingen
- 2VoorbeeldZet JSON-waarden om naar Python
- 3UitlegKies expliciet een tabelindeling
- 4UitdagingBehoud een JSON-identificatiecode
- 5TipMaak uitgewisselde JSON leesbaar en geldig
- 6VoorbeeldBegin met één rij per bestelling
- 7VoorbeeldVouw de gekozen lijst uit
- 8KernpuntStem totalen af op het detailniveau per rij
- 9UitdagingHoud een bovenliggend record zonder items zichtbaar
- 10VoorbeeldControleer de status voordat je een tabel maakt
- 11TipBescherm toegang en houd je aan wachttijden
- 12UitdagingNeem elke pagina mee
- 13UitlegHaal records uit het omhulsel en inspecteer ontbrekende waarden
- 14VerbandHerken een ander webformaat
- 15UitdagingScheid verzamelen van normaliseren
- 16SamenvattingControleer elke stap in de juiste volgorde
5Kies wat je opgeslagen bestand behoudt
13 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieSla op voor de volgende lezer
- 2VoorbeeldSchrijf de bedoelde CSV-velden
- 3KernpuntEen export kan precisie en types verliezen
- 4UitdagingVoeg alleen records toe
- 5UitlegLees kolommen zonder elk veld in te lezen
- 6VerbandStem formaten af op activiteiten
- 7UitdagingKies voor uitwisselbaarheid en vertrouwen
- 8VoorbeeldSchrijf en lees een tabel met vastgelegde types
- 9VoorbeeldGebruik een bruikbare indeling in mappen
- 10UitdagingVoorkom duizenden kleine delen
- 11TipVoeg bestanden met compatibele types toe
- 12UitdagingBewaar een rapport en een analysedataset
- 13SamenvattingControleer de eigenschappen die je later nodig hebt
6Lees queryresultaten in en controleer schrijfbewerkingen naar tabellen
14 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieLezen geeft gegevens terug; schrijven verandert ze
- 2VoorbeeldLees uit een lokale SQLite-database
- 3UitlegBeheer de levensduur van engines en verbindingen
- 4UitdagingVerstuur een query in plaats van een tabelnaam
- 5VoorbeeldBind een veranderende grenswaarde
- 6KernpuntEen waarde kan geen querysyntaxis worden
- 7UitdagingBehoud types en parametergrenzen
- 8TipVerwerk gegevensblokken terwijl de verbinding open is
- 9UitlegBepaal wat er met bestaande records gebeurt
- 10VoorbeeldVoeg toe binnen een transactie
- 11UitdagingControleer de wijziging en de herhaalde uitvoering
- 12TipControleer opgeslagen resultaten rechtstreeks
- 13UitdagingBehoud de definitie en vervang een momentoverzicht
- 14SamenvattingStem de aanroep af op het effect in de database
Gegevens inlezen en opslaan: oefenvragen
Set 1: Lees de gegevens en controleer hun betekenis10 Oefenvragen
Vraag 1 van 10
S14,East,8. Hoe moet je het inlezen zodat dit record gegevens blijft?Toon antwoordVerberg antwoord
header=None geeft aan dat er geen labelrij is, terwijl names de labels afzonderlijk opgeeft. Met header=0 zou het eerste record als kopregel worden gebruikt, ook als vervangende namen worden opgegeven. De rij die met S14 begint, moet bij de waarnemingen blijven.Vraag 2 van 10
sensor;distance_m gevolgd door R8;2.450,75. Hoe moet de afstand 2450,75 worden?Toon antwoordVerberg antwoord
Vraag 3 van 10
"é" twee. Hoeveel bytes coderen "été"?Toon antwoordVerberg antwoord
"t" gebruikt er één, samen vijf bytes. Met drie tel je de tekens, niet hun gecodeerde grootte. Het onderscheid is belangrijk bij het onderzoeken van opgeslagen bytes of het vaststellen van een coderingsprobleem.Vraag 4 van 10
Toon antwoordVerberg antwoord
nrows=3 de drie waarnemingen in. Als je drie rijen overslaat, wordt bij de standaardinstelling voor de kopregel de eerste waarneming als labels gebruikt. Als je vier gegevensrijen inleest, wordt ook het totaal als waarneming opgenomen.Vraag 5 van 10
Toon antwoordVerberg antwoord
lines=True geeft pandas opdracht afzonderlijke JSON-records regel voor regel in te lezen. Alleen de oriëntatie veranderen maakt van opeenvolgende objecten geen gewoon JSON-document. Het regelformaat ondersteunt ook blokgewijs inlezen wanneer je een groot logbestand in delen wilt verwerken.Vraag 6 van 10
count, next en results; elk element in results is een genest record over apparatuur. Wat moet je aan json_normalize doorgeven voor een apparatuurtabel?Toon antwoordVerberg antwoord
results bevat de waarnemingsrecords, dus normalisatie van die lijst levert rijen met apparatuur op en vouwt geneste objectvelden uit. Normalisatie van het hele omsluitende object levert daarentegen één rij voor het omhulsel op en laat de recordlijst in een cel staan. Bewaar de andere velden voor controles van de verzameling en paginering.Vraag 7 van 10
"Unnamed: 0" met alleen de oude standaardrijnummers. Welke exportwijziging voorkomt dit?Toon antwoordVerberg antwoord
index=False laat die labels weg. Als je de kopregel uitschakelt, verwijder je de werkelijke kolomnamen en pak je het ongewenste indexveld niet aan.Vraag 8 van 10
Toon antwoordVerberg antwoord
Vraag 9 van 10
readings en con is een gewone SQLite-verbinding. Welke aanroep haalt de tabel op als DataFrame?Toon antwoordVerberg antwoord
read_sql_table heeft een SQLAlchemy-verbinding nodig in plaats van een gewone sqlite3-verbinding.Vraag 10 van 10
WHERE site = ?. Hoe moet de enkele waarde "West" worden doorgegeven?Toon antwoordVerberg antwoord
:site, en niet bij het vraagteken dat hier wordt gebruikt.Set 2: Behoud waarden tussen bestanden en verbindingen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
"NA" een geldig zonelabel en betekent een lege telling dat de waarde ontbreekt. Welke configuratie behoudt beide betekenissen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
"André". Wat is de juiste oplossing?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
with con:. Wat moet nog gebeuren nadat het databasewerk is voltooid?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
day en gehele tellingen met NULL in n. Een script moet een tijdens de uitvoering opgegeven locatie selecteren zonder de querystructuur te veranderen. Welke combinatie past?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 3: Onderzoek ingelezen gegevens voordat je de tabel vertrouwt10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
"Field ""A,B""",7. Welke waarden moet een standaard-CSV-parser opleveren?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
code;score;day en 00064;999;07/08/2026. De code is een identificatiecode, 999 betekent alleen voor score ontbrekend en bij datums komt de dag eerst. Welke inleesopdracht behoudt alle drie de betekenissen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
open() van Python laat bij gewone UTF-8-decodering een UTF-8-BOM aan het begin staan in de eerste kolomnaam. Welke coderingsinstelling verwijdert die markering?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
amount met enkele ontbrekende waarden. Het programma heeft het totale gemiddelde nodig met beperkt geheugen. Welke aanpak blijft correct als gegevensblokken verschillende aantallen geldige waarden bevatten?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
00000. Een formulecel heeft geen opgeslagen resultaat. Wat kun je verwachten als pandas de code met een teksttype inleest?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
[{"device":"00091","active":true}]. Hoe moet pandas die inlezen zonder de tekenreeks als pad te behandelen of de nullen van de identificatiecode te verwijderen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
next-URL. Het aantal verzamelde rijen ligt onder count. Een collega rapporteert de huidige tabel als volledig. Wat is de fout?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
float_format="%.2f" en later als getal ingelezen. Welke waarde kan die CSV herstellen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
code in 2025 op als tekst en in een voorgesteld bestand voor 2026 als gehele getallen. De nieuwe gegevens bevatten ook slechts één rij per vrijwel unieke code. Welke voorbereiding ondersteunt betrouwbaar inlezen het best?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Verbind inleeskeuzes met opgeslagen resultaten10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
"7,680.25". Het scheidingsteken wordt correct gelezen, maar het bedrag blijft tekst. Welke extra inleesoptie past bij het getal?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
site,jan,feb. Het middendeel bevat een regel # note en eindigt met een totaal plus een bronvermelding. Welke configuratie leest alleen waarnemingen in zonder opmerkingen als records te behandelen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
(visit_id, visit_fee, part_cost): (51, 12, 3), (51, 12, 5) en (52, 7, 4). Wat is het totaal van bezoekkosten plus onderdelen voor deze twee bezoeken?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Retry-After: 45. Welke voortzetting behoudt de verzameling en houdt rekening met het antwoord?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 5: Los meerdere risico's bij inlezen en opslaan op10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
"0072" en "0073", tellingen als gehele getallen met ontbrekende waarden en de datums "12/01/2026", "26/01/2026". De bron bepaalt dat bij datums de dag eerst komt. Welke combinatie behoudt deze betekenissen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
on_bad_lines="skip". Van 1.000 bronwaarnemingen worden er 995 ingelezen; twee daarvan hebben ontbrekende velden aan het einde. Wat volgt uit deze resultaten?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
afsluitende rapportregels
API-eindpunt
API-sleutel
ASCII
automatische typeafleiding
B
bestand met vaste veldbreedtes
byte
bytevolgordemarkering
utf-8-sig gebruikt om tekst met Python in te lezen, wordt een UTF-8-BOM aan het begin uit de eerste kolomnaam verwijderd.C
categorische kolom
compressie
.csv.gz-bestand tijdens het inlezen decomprimeren zonder eerst een ongecomprimeerde kopie te maken.compressiecodec
controle van weggeschreven gegevens
CSV
cursor aan de serverzijde
D
databasestuurprogramma
databaseverbinding
datumnotatie
%d/%m/%Y maakt van "09/10/2026" 9 oktober in plaats van 10 september.decimaalteken
"8,75" dezelfde waarde als 8.75 in Python-uitvoer.decodering
deelaggregaat
detailniveau per rij
E
Excel-bibliotheek
.xlsx-bestand mislukken, ook wanneer pandas zelf is geïnstalleerd.ExcelWriter
export van de index
"Unnamed: 0" te voorkomen.F
Feather
G
gebonden parameter
gegevensblok
gegevensschema
geheelgetaltype met ondersteuning voor ontbrekende waarden
Int64.<NA> weergeven.geheugengebruik inclusief objectinhoud
gepartitioneerde dataset
year=2025 en year=2026 heten, kan een jaarfilter zich op het benodigde deel richten.gewogen gemiddelde
H
halfopen bereik
(2, 7) selecteert vijf tekenposities en eindigt net vóór positie 7.HDF5
HTTP-statuscode
I
identificatiecode
"00028" als tekst inleest, behoud je de nullen die nodig zijn om die te koppelen aan dezelfde code in een bronlijst.J
JSON
JSON Lines
JSON-array
null voor een ontbrekende meting.JSON-object
"active" koppelen aan true en "name" aan het tekstlabel van een station.JSON-oriëntatie
K
kolomgeoriënteerde opslag
kolommen met een MultiIndex
("sales", "2026").kopregel
L
Latin-1
M
markering voor ontbrekende waarden
"-" betekent dat een score ontbreekt, voorkom je door die als ontbrekend op te geven dat de scorekolom tekst blijft.metadata van het bovenliggende object
N
normalisatie
O
omsluitend API-object
onjuist opgebouwde regel
opgeslagen formuleresultaat
opslaan als CSV en opnieuw inlezen
P
pad naar records
record_path="items" maak je een artikelrij voor elk element van de artikellijst van een bestelling.paginering
Parquet
parser
skipfooter nodig is, gebruikt de Python-parser omdat de C-parser die optie niet ondersteunt.pickle
plaatsaanduiding
? voor positionele waarden en :name voor waarden die in een dictionary worden opgegeven.projectie
read_parquet wanneer een analyse alleen regio en bedrag nodig heeft.R
record
relationele database
rijen toevoegen
ruwe gegevens
S
samengevoegd celbereik
scheidingsteken
sep=";" nodig, ook als de bestandsextensie .csv is.scheidingsteken voor duizendtallen
"4.200,50" gebruikt een punt voor duizendtallen en een komma voor het decimale deel.schrijven over een bestaand werkblad
serialisatie
json.dump om records naar een open UTF-8-bestand te serialiseren in plaats van de Python-tekstweergave van een dictionary te schrijven.signaalwaarde
SQL-injectie
SQLAlchemy-engine
SQLite
T
tabelvervanging
tekencodering
terugdraaien
toevoegmodus
transactie
U
uitvoerprecisie
UnicodeDecodeError
UTF-8
"é" gebruikt twee bytes in UTF-8, dus hoeft het aantal tekens niet overeen te komen met het aantal bytes van het bestand.UTF-16
encoding="utf-16-le" als dat de gedocumenteerde indeling is.V
velden tussen aanhalingstekens plaatsen
"Harbor, West" behoudt de komma binnen één locatienaam tijdens het inlezen van CSV.verminkte tekst door onjuiste decodering
"Ã" op de plaats van een accent is een aanwijzing om te controleren of bytes in UTF-8 als Windows-1252 zijn gelezen.vervangingsteken
"�", markeert inhoud die een decoder niet kon interpreteren toen die de opdracht kreeg ongeldige bytes te vervangen."Ren�" is ingelezen, heeft tekeninformatie verloren; bewaar de oorspronkelijke bytes om de naam correct opnieuw in te lezen.verzoeklimiet
W
wachttijdlimiet voor een verzoek
weergave van ontbrekende waarden
"NA" schrijft, blijft die onderscheiden van een geregistreerde nul wanneer de ontvanger de waarde correct inleest.weergaveopmaak
"15%" wordt weergegeven, slaat 0,15 op, dus de ingelezen waarde is een verhouding en niet het getal 15.werkblad
sheet_name=1 lees je het tweede werkblad, dat kan verschillen van het op het scherm geopende werkblad.werkmap
.xlsx-werkmap kan afzonderlijke werkbladen voor waarnemingen, totalen en een rapportsamenvatting bevatten.Windows-1252
Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.