- Leren
- Informatica & ICT
- Data science & AI
- Data-analyse met Python: NumPy, pandas en visualisatie
- Gegevens bewerken met pandas
Gegevens bewerken met pandas
GemiddeldLes 4 van 8 in Cursus Data-analyse met Python: NumPy, pandas en visualisatie
Wat je leert
- Spoor ontbrekende waarden en dubbele rijen in een pandas-DataFrame op, bepaal of je ze verwijdert, aanvult of behoudt en controleer wat elke keuze met de gegevens doet.
- Spoor ontbrekende waarden in een DataFrame opHerken hoe pandas ontbrekende gegevens markeert, tel ze per kolom en per rij en spoor verborgen codes op die ontbrekende waarden aanduiden.
- Verwijder of vul ontbrekende waarden aanVerwijder onvolledige rijen of kolommen met dropna, of vul ontbrekende waarden aan met vaste waarden, statistieken, naburige waarden of interpolatie. Kies de methode die bij de gegevens past.
- Spoor dubbele rijen op en verwijder zeMarkeer en verwijder herhaalde rijen met duplicated en drop_duplicates, vergelijk zo nodig alleen sleutelkolommen en behoud de juiste kopie van elk record.
- Spoor ontbrekende waarden in een DataFrame op
- Wijzig waarden in een kolom op een beheerste manier: vervang codes, wijs waarden toe via een opzoektabel, converteer datatypes, hernoem labels en zet getallen om in groepen, geschaalde waarden en indicatorkolommen.
- Vervang waarden, wijs ze aan andere waarden toe en converteer zeVervang exacte waarden met replace, wijs waarden via een dictionary of functie aan andere waarden toe met map, hernoem rijen en kolommen en converteer tekst veilig naar getallen.
- Deel waarden in klassen in, schaal ze, begrens ze en codeer zeDeel getallen met cut en qcut in intervallen in, herschaal kolommen, begrens extreme waarden met clip en maak indicatorkolommen voor categorieën.
- Vervang waarden, wijs ze aan andere waarden toe en converteer ze
- Standaardiseer en doorzoek tekstkolommen met de str-accessor en reguliere expressies en sla kolommen met een vaste verzameling waarden efficiënt op als categorische kolommen.
- Schoon tekstkolommen op met tekenreeksmethodenGebruik de gevectoriseerde str-methoden om tekst in alle rijen van een kolom tegelijk bij te snijden, het hoofdlettergebruik te wijzigen, te splitsen, te doorzoeken, te vervangen en samen te voegen.
- Zoek patronen en haal tekst eruit met reguliere expressiesSchrijf eenvoudige reguliere expressies en gebruik ze met contains, extract, findall en replace om gestructureerde tekstdelen te testen, eruit te halen en op te schonen.
- Gebruik het categorische datatypeConverteer kolommen met een beperkte verzameling waarden naar categorische kolommen, werk met hun categorieën en codes en gebruik geordende categorieën voor waarden met een natuurlijke volgorde.
- Schoon tekstkolommen op met tekenreeksmethoden
- Breng gegevens uit meerdere tabellen samen: koppel rijen op sleutelkolommen of indexlabels met merge en join, vul ontbrekende waarden aan vanuit een tweede bron en stapel tabellen met concat.
- Voeg DataFrames samen op sleutelkolommenCombineer twee tabellen met merge door waarden in sleutelkolommen te koppelen, kies het type join en controleer het resultaat op rijen zonder overeenkomst en op vermenigvuldigde rijen.
- Koppel tabellen op de index en vul ontbrekende waarden aan vanuit een andere tabelVoeg samen op indexlabels met join of left_index en right_index en gebruik combine_first en uitlijning op labels om ontbrekende waarden vanuit een tweede bron aan te vullen.
- Stapel DataFrames met concatVoeg tabellen met pd.concat samen langs rijen of kolommen, bepaal de resulterende index en kolommen en geef aan waar elk deel vandaan komt.
- Voeg DataFrames samen op sleutelkolommen
- Werk met tabellen met meerdere indexniveaus en zet gegevens met stack, unstack, pivot en melt om tussen lang en breed formaat.
- Werk met hiërarchische indexenMaak en lees een MultiIndex, selecteer gegevens op buitenste en binnenste niveaus, wijzig de volgorde van niveaus en sorteer ze, en verplaats niveaus tussen de index en de kolommen.
- Herstructureer gegevens met stack en unstackVerplaats kolomlabels met stack naar de index en indexniveaus met unstack naar kolommen, en verwerk de ontbrekende combinaties die bij het herstructureren zichtbaar worden.
- Zet gegevens met pivot en melt om tussen lang en breed formaatHerken lange en brede indelingen, zet lange gegevens met pivot of pivot_table om in een brede tabel en zet een brede tabel met melt om in lange gegevens.
- Werk met hiërarchische indexen
Gegevens bewerken met pandas: uitleg
1Spoor ontbrekende waarden en duplicaten op en verwerk ze
Een ontbrekende waarde, een nul en een herhaald record hebben verschillende betekenissen. Leer hoeveel gegevens ontbreken voordat je kiest wat je behoudt, verwijdert of schat, en herken duplicaten aan de kolommen die een record definiëren. Kleine weer- en besteltabellen laten zien hoe pandas deze beslissingen verwerkt en hoe ze rijaantallen, datatypes en statistieken beïnvloeden. Elke wijziging heeft een zichtbaar resultaat dat je kunt controleren voordat je verdergaat met een analyse.
1.1 Zoek ontbrekende waarden voordat je gaat rekenen
Ontbrekende gegevens betekenen dat een waarde onbekend of niet beschikbaar is. pandas slaat op die plaats een speciale markering op. Spoor die markering op voordat je totalen berekent of bepaalt welke rijen bruikbaar zijn.
Herken de markeringen
De markering hangt af van het datatype. Float-kolommen gebruiken NaN, datetime-kolommen gebruiken NaT en datatypes met ondersteuning voor ontbrekende waarden, zoals "Int64", "boolean" en "string", gebruiken pd.NA. pandas 3 leidt voor tekstkolommen het type str af, met NaN voor ontbrekende tekst. Ook Python's None wordt als ontbrekend herkend. Gebruik import pandas as pd en import numpy as np voor de voorbeelden.
df.isna() maakt een booleaanse tabel met dezelfde rijen en kolommen als df. Een True markeert een ontbrekende waarde; df.notna() markeert aanwezige waarden. De alternatieve namen isnull() en notnull() doen hetzelfde. Vergelijk een kolom niet met np.nan: NaN is zelfs niet gelijk aan zichzelf, dus s == np.nan vindt de ontbrekende waarden niet.
Tel cellen en getroffen rijen
Bekijk deze weermetingen:
| city | temp_c | rain_mm |
|---|---|---|
| Lima | 18,0 | 0,0 |
| Oslo | NaN | 4,0 |
| Pune | 31,0 | NaN |
| Kyiv | NaN | NaN |
Een booleaanse True telt als 1, dus df.isna().sum() geeft 0 ontbrekende steden, 2 temperaturen en 2 neerslagmetingen. df.isna().mean() geeft aandelen van 0,0; 0,5 en 0,5. Voor het aandeel van elke kolom zijn alle vier de rijen de noemer.
Gebruik df.isna().any(axis=1) om getroffen rijen te vinden. Dit geeft False, True, True, True terug; optellen geeft 3. Daarentegen geeft df.isna().sum().sum() 4 ontbrekende cellen. Kyiv draagt twee cellen bij, maar slechts één getroffen rij. Gebruik de maat die antwoord geeft op je vraag.
Herken verborgen codes voor ontbrekende waarden
Een instrument kan een niet-beschikbare meting vastleggen als -999, "-" of "unknown". Dit zijn gewone waarden totdat je ze converteert. Nadat je de betekenis van de code hebt bevestigd, gebruik je df.replace([-999, "unknown"], np.nan). Bij het inlezen van CSV voegt na_values=[-999, "unknown"] deze codes toe aan de herkende markeringen. Lege CSV-velden en veelvoorkomende tekenreeksen zoals "NA", "n/a" en "NULL" worden standaard al herkend.
Een neerslagmeting van nul kan betekenen dat er geen regen is gevallen, dus als je elke nul vervangt, vernietig je echte waarnemingen. Ook zijn een lege tekenreeks die in het geheugen is gemaakt, "", en een tekenreeks met spaties voor isna() niet ontbrekend. Inspecteer opgeslagen tekst en tel niet alleen de markeringen. Gebruik value_counts(dropna=False) om ontbrekende categorieën in een frequentietabel op te nemen.
Controleer berekeningen en datatypes
Voor s = pd.Series([4, np.nan, 8]) is s.mean() 6,0: de methode gebruikt de twee bekende waarden. s.count() is 2, terwijl len(s) 3 is. Als je s.sum() deelt door len(s), krijg je 4,0 en behandel je de ontbrekende waarde ten onrechte als nul. De meeste statistieken slaan ontbrekende waarden standaard over; een kolom met uitsluitend ontbrekende waarden heeft som 0 maar gemiddelde NaN.
Een ontbrekende waarde kan ook de opslag veranderen. pd.Series([3, None, 5]) wordt float64 en bevat 3,0; NaN en 5,0. Met dtype="Int64" blijven de gehele waarden behouden en staat <NA> voor de ontbrekende waarde. De hoofdletter I duidt het pandas-geheelgetaltype met ondersteuning voor ontbrekende waarden aan.
Belangrijkste punten
- Gebruik
isna()om markeringen voor ontbrekende waarden in verschillende datatypes op te sporen. - Tel ontbrekende cellen afzonderlijk van rijen met minstens één ontbrekende waarde.
- Converteer codes waarvan vaststaat dat ze ontbreken betekenen; behoud geldige nullen.
- Controleer hoeveel bekende waarden voor een statistiek worden gebruikt.
- Gebruik
"Int64"als gehele waarden een markering voor ontbrekende waarden nodig hebben.
1.2 Kies wat je verwijdert of aanvult
Als je een rij verwijdert, verwijder je behalve de ontbrekende waarden ook de bekende waarden. Als je een ontbrekende waarde aanvult, behoud je de rij maar voeg je een schatting toe. Kies op basis van de betekenis van de waarneming en de kolommen die de analyse nodig heeft.
Bepaal welke rijen worden verwijderd
df.dropna() verwijdert elke rij met een ontbrekende waarde. In de weertabel blijft alleen Lima over. Beperk de keuze met subset of stel met thresh een minimumaantal aanwezige cellen in.
| Aanroep | Behouden rijen | Reden |
|---|---|---|
df.dropna(subset=["temp_c"]) | Lima, Pune | Temperatuur is aanwezig |
df.dropna(thresh=2) | Lima, Oslo, Pune | Minstens twee cellen zijn aanwezig |
df.dropna(how="all") | Alle vier | Elke rij heeft een stad |
axis="columns" verwijdert kolommen met ontbrekende waarden en behoudt hier alleen city. In een brede tabel kan de standaardregel voor rijen veel gegevens verwijderen, omdat een ontbrekende waarde in een willekeurige kolom al genoeg is. Vergelijk len(df) voor en na het verwijderen.
Ken het resultaat toe
Leer de vorm met een nieuwe toekenning: df = df.dropna(). Opschoningsmethoden geven standaard een nieuw object terug. pandas 3.1 raadt inplace=True af voor onder meer de methoden dropna, drop_duplicates en rename.
Voor één kolom schrijf je df["temp_c"] = df["temp_c"].fillna(0). Een geketende aanroep zoals df["temp_c"].fillna(0, inplace=True) wijzigt het bovenliggende DataFrame nooit onder het kopiëren bij schrijven van pandas 3. Met een toekenning maak je duidelijk waar het resultaat terechtkomt.
Vul aan met een passende waarde
Met een dictionary per kolom kun je een gemengde tabel passende waarden geven: df.fillna({"rain_mm": 0, "city": "Unknown"}). Kolommen die niet in de dictionary staan behouden hun ontbrekende waarden. Een scalaire waarde zoals 0 is handig voor een tabel met alleen numerieke waarden waarvan alle kolommen die waarde accepteren. Tekst aanvullen met een getal is niet toegestaan; pandas 3.1 waarschuwt hiervoor en een toekomstige versie zal het afwijzen.
De bekende temperaturen zijn 18,0 en 31,0. Hun gemiddelde is 24,5, dus df["temp_c"].fillna(df["temp_c"].mean()) vult beide ontbrekende waarden met 24,5. Een extreme waarde kan het gemiddelde sterk beïnvloeden; de mediaan is minder gevoelig. Bewaar vóór het aanvullen een indicator met df["temp_missing"] = df["temp_c"].isna(), zodat geschatte en waargenomen waarden te onderscheiden blijven.
Aanvullen met het gemiddelde verkleint de zichtbare spreiding van de kolom. Een ver verwijderde vaste waarde kan die vergroten. Als je neerslag aanvult met 0, stel je dat er geen regen is gevallen; dat is ongepast als een sensor uitstond.
Gebruik naburige metingen als de volgorde ertoe doet
ffill() neemt de laatst bekende waarde vooruit over; bfill() neemt de eerstvolgende bekende waarde achteruit over. Voor 12,0; NaN; NaN; NaN; 15,0 geeft voorwaarts opvullen vier waarden van 12,0 gevolgd door 15,0. ffill(limit=1) vult alleen de eerste ontbrekende waarde in die reeks aan. Een ontbrekende waarde aan het begin heeft geen vorige waarde en blijft ontbreken. Gebruik ffill() rechtstreeks; fillna(method="ffill") is in pandas 3 verwijderd.
interpolate() schat tussen naburige posities. Voor 10, NaN, NaN, 16 geeft lineaire interpolatie 10, 12, 14, 16. Dit past bij geleidelijk veranderende metingen in een betekenisvolle volgorde. Waarden overnemen of interpoleren tussen steden die geen verband hebben, zou een relatie opleggen die de rijen niet hebben.
Voer na elke bewerking isna().sum() opnieuw uit en controleer ook de rijaantallen. Een geslaagde methodeaanroep vertelt je dat de code is uitgevoerd; deze controles laten zien wat er is veranderd.
Belangrijkste punten
- Gebruik
subset,howofthreshom aan te geven welke ontbrekende waarden ertoe doen. - Ken teruggegeven resultaten toe aan het DataFrame of de kolom die je wilt wijzigen.
- Kies opvulwaarden die passen bij zowel het datatype van de kolom als de betekenis van de ontbrekende waarde.
- Bewaar een indicator voor ontbrekende waarden voordat je geschatte waarden invult.
- Gebruik methoden met naburige waarden alleen als de rijvolgorde betekenisvol is.
- Controleer na het opschonen de aantallen rijen en ontbrekende waarden.
1.3 Bepaal wat een record is voordat je kopieën verwijdert
Twee rijen kunnen op elkaar lijken zonder dezelfde gebeurtenis te beschrijven. Bepaal voordat je duplicaten verwijdert welke waarden één record identificeren. Een bestel-ID kan een bestelling identificeren; een klant en datum alleen kunnen meerdere geldige aankopen aanduiden.
Markeer de extra kopieën
df.duplicated() geeft één booleaanse waarde per rij terug. Standaard vergelijkt de methode alle kolommen, behoudt ze de eerste keer dat een rij voorkomt en markeert ze latere kopieën met True. Als je het resultaat optelt, tel je extra kopieën, niet alle leden van herhaalde groepen.
Bekijk zes bestelrijen met ID's 101, 102, 102, 103, 104, 104. De twee rijen voor 102 zijn identiek. De twee rijen voor 104 hebben verschillende geregistreerde gewichten, 0,5 kg en 0,8 kg. Als alle kolommen worden vergeleken, is er één extra kopie: df.duplicated().sum() is 1. df.drop_duplicates() behoudt vijf rijen omdat de twee verschillende rijen voor 104 geen exacte kopieën zijn.
Vergelijk de kolommen die de identiteit bepalen
df.duplicated(subset=["order_id"]) vergelijkt alleen ID's. Dit markeert de tweede 102 en de tweede 104, wat twee extra kopieën geeft. De waarden in de andere kolommen beïnvloeden deze beslissing niet meer. Inspecteer de tegenstrijdige gewichten voordat je kiest welk bestelrecord je behoudt.
Waarde van keep | Gedrag bij een herhaalde groep |
|---|---|
"first" | Behoud de eerste rij in de huidige volgorde |
"last" | Behoud de laatste rij in de huidige volgorde |
False | Verwijder elk lid van een herhaalde groep |
df.drop_duplicates(subset="order_id", keep="last") behoudt in deze volgorde de versie van 0,8 kg van bestelling 104. De laatste rij behouden betekent op zichzelf niet dat je het nieuwste record behoudt. Stel die volgorde eerst vast:
latest = df.sort_values("updated").drop_duplicates(
subset="customer_id", keep="last"
)
Sorteren op updated plaatst oudere records vóór nieuwere. De controle op duplicaten vergelijkt daarna alleen customer_id, zodat verschillende bijwerktijden niet verhinderen dat twee rijen als versies van dezelfde klant worden herkend.
Onderscheid rijwaarden van indexlabels
Deze methoden vergelijken waarden en negeren indexlabels. Identieke rijen met de labels 4 en 9 tellen nog steeds als duplicaten. Ontbrekende waarden op overeenkomstige posities tellen bij deze controle als gelijk. Gebruik df.index.duplicated() om de labels zelf op herhaling te controleren.
Een exacte vergelijking behoudt ook verschillen in hoofdletters en witruimte. De waarden “ Lisbon”, “lisbon” en “LISBON ” zijn verschillend. Schoon ze op met .str.strip().str.lower() voordat je op duplicaten controleert als deze schrijfwijzen dezelfde stad aanduiden. Anders telt nunique() drie namen voor één plaats.
Controleer uniciteit waar de relatie dat vereist
Een opzoektabel hoort één rij per opzoeksleutel te hebben als elk record één set gegevens moet krijgen. lookup["customer_id"].is_unique controleert die eis. Herhaalde klant-ID's in een besteltabel zijn normaal, omdat een klant meerdere bestellingen kan plaatsen.
Als een opzoeksleutel wordt herhaald, herhaalt een latere samenvoeging elke bijpassende bestelling voor elke bijpassende rij in de opzoektabel. Als je duplicaten uit de bestellingen verwijdert, gooi je echte aankopen weg zonder de opzoektabel te herstellen. Controleer de bedoelde sleutel in de juiste tabel, inspecteer tegenstrijdige records en vergelijk het aantal rijen na het verwijderen.
Belangrijkste punten
- Definieer een record met de juiste sleutelkolommen voordat je kopieën verwijdert.
duplicated().sum()telt latere kopieën met de standaardinstellingkeep="first".- Sorteer op bijwerktijd voordat je het nieuwste record behoudt.
- Duplicaten in rijwaarden en herhaalde indexlabels vereisen afzonderlijke controles.
- Unieke opzoeksleutels voorkomen onbedoelde vermenigvuldiging van rijen bij samenvoegingen.
2Transformeer waarden door vervanging, waardetoewijzing en klasse-indeling
Als je een kolom transformeert, verander je de betekenis of de weergave van de waarden. Kies tussen exacte vervangingen, waardetoewijzingen, numerieke conversie, intervallen, geschaalde waarden en indicatorkolommen. Je bekijkt de invoer en uitvoer van elke methode, inclusief wat er gebeurt met waarden zonder overeenkomst en grenswaarden, zodat een handige bewerking categorieën niet ongemerkt verandert of bruikbare metingen verloren laat gaan.
2.1 Wijzig waarden en labels bewust
Een vervanging wijzigt overeenkomende waarden, een opzoektabel vertaalt waarden en een hernoeming wijzigt labels. Deze taken kunnen er in code vergelijkbaar uitzien, maar geven verschillende resultaten als een waarde niet in een dictionary staat.
Vervang exacte waarden
s.replace("N/A", np.nan) wijzigt alleen cellen die gelijk zijn aan "N/A". Een lijst kan meerdere oude waarden bevatten: s.replace(["-", "?"], np.nan). Een dictionary geeft afzonderlijke vervangingen, zoals s.replace({"M": "male", "F": "female"}). Waarden zonder overeenkomst blijven zoals ze waren.
Voor een hele tabel beperkt een geneste dictionary de wijziging tot één kolom: df.replace({"status": {0: "open", 1: "closed"}}). Zo voorkom je dat andere nullen en enen elders veranderen. Ken het teruggegeven resultaat toe om de wijziging te behouden.
replace vergelijkt volledige cellen. Bij “Main St” en “St” verandert s.replace("St", "Street") alleen “St”. Gebruik s.str.replace("St", "Street", regex=False) om delen van een tekenreeks te wijzigen; dit levert ook “Main Street” op.
Wijs waarden toe via een opzoektabel
Vergelijk voor de codes “PT”, “JP” en “KE” dezelfde dictionary in twee methoden:
| Methode | PT | JP | KE |
|---|---|---|---|
s.map({"PT": "Portugal", "JP": "Japan"}) | Portugal | Japan | NaN |
s.replace({"PT": "Portugal", "JP": "Japan"}) | Portugal | Japan | KE |
Een dictionary die je aan map geeft, bepaalt de beschikbare uitvoerwaarden. Een ontbrekende sleutel heeft geen uitvoer en wordt een ontbrekende waarde. Controleer achteraf isna().sum() zodat een onvolledige opzoektabel zichtbaar wordt.
map accepteert ook een functie: s.map(lambda x: x * 1000) zet waarden in kilometers om naar meters. Voor deze berekening is s * 1000 eenvoudiger en sneller, omdat de expressie op de hele kolom werkt. DataFrame.map past een functie cel voor cel toe; het vervangt de verwijderde methode applymap.
Converteer tekst naar getallen
astype vraagt om een datatype, zoals "float64", "Int64" of "category". De methode geeft een fout als een waarde niet kan worden geconverteerd. Voor de tekst "12", "7.5" en "n/a" geeft pd.to_numeric(s, errors="coerce") daarentegen 12,0, 7,5 en NaN. Deze typeconversie met ontbrekende waarden bij fouten behoudt leesbare getallen, maar vereist dat je de mislukte conversies inspecteert.
Opmaak kan conversie verhinderen, ook als het getal geldig is. Verwijder voor “1,200” en “950” eerst het scheidingsteken voor duizendtallen:
cleaned = s.str.replace(",", "", regex=False)
numbers = pd.to_numeric(cleaned, errors="coerce")
failed = s.notna() & numbers.isna()
Hier markeert failed waarden die vóór de conversie aanwezig waren maar daarna ontbreken. Het vergelijken van aantallen ontbrekende waarden geeft een bruikbaar totaal; het masker wijst ook de oorspronkelijke tekst aan die je kunt inspecteren. Verwijder bekende eenheden op dezelfde zorgvuldige manier uit tekst met metingen voordat je converteert.
Hernoem de labels
df.rename(columns={"Qty": "quantity"}) wijzigt een kolomkop en laat de cellen ongewijzigd. df.rename(columns=str.lower) maakt alle kolomkoppen klein. Een reeks zoals df.columns.str.strip().str.lower().str.replace(" ", "_", regex=False) zet “Total KG ” om in total_kg; ken die toe aan df.columns.
Gebruik replace of map voor waarden binnen een kolom. Gebruik rename voor de labels waarmee je die waarden selecteert.
Belangrijkste punten
replacebehoudt waarden zonder overeenkomst;mapmet een dictionary maakt ze ontbrekend.- Gebruik
.str.replaceom een deel van elke tekstwaarde te wijzigen. - Geef bij eenvoudige kolomberekeningen de voorkeur aan gevectoriseerd rekenen.
- Inspecteer nieuw ontbrekende waarden na numerieke typeconversie met ontbrekende waarden bij fouten.
renamewijzigt labels en laat gegevenswaarden ongewijzigd.
2.2 Groepeer en herschaal metingen
Sommige analyses hebben exacte metingen nodig, andere groepen of vergelijkbare numerieke bereiken. Houd de oorspronkelijke betekenis helder: klasse-indeling maakt categorieën, schalen verandert de numerieke schaal en begrenzen vervangt extreme waarden.
Plaats waarden in intervallen
pd.cut(ages, [18, 30, 45, 65]) gebruikt de intervallen (18, 30], (30, 45] en (45, 65]. Het ronde haakje sluit het linkergrenspunt uit; het vierkante sluithaakje sluit het rechtergrenspunt in. De leeftijden 19, 25 en 30 vallen in het eerste interval, 41 in het tweede en 64 in het derde. Leeftijd 18 wordt ontbrekend omdat die op de uitgesloten linkergrens ligt.
include_lowest=True neemt die laagste waarde op in het eerste interval. right=False maakt daarentegen links gesloten intervallen zoals [18, 30), zodat 30 in het tweede interval valt. Waarden buiten alle intervallen blijven ontbreken. Test zowel de exacte grenzen als gebruikelijke waarden ertussen.
Er moet één label per interval zijn, één minder dan het aantal grenzen. Met labels=["18-30", "31-45", "46-65"] en include_lowest=True geven de zes leeftijden hierboven de aantallen 4, 1 en 1. Deze labels beschrijven leeftijden in hele jaren; de intervalgrenzen blijven de indeling bepalen.
Kies grenzen of groepsgroottes
| Bewerking | Wat wordt bepaald | Nuttig doel |
|---|---|---|
pd.cut(x, [18, 30, 45, 65]) | Vaste grenzen | Betekenisvolle bereiken |
pd.cut(x, 4) | Vier even brede intervallen | Waardebereiken vergelijken |
pd.qcut(x, 4) | Vier groepen met ongeveer gelijke aantallen | Rangordes in de gegevens vergelijken |
Voor 2, 4, 6, 8, 10, 12, 14, 16 geeft qcut twee waarden per kwartielgroep. Groepen met gelijke aantallen hoeven geen even brede numerieke bereiken te beslaan.
Schaal zonder groepen te maken
Min-maxschaling gebruikt (x - x.min()) / (x.max() - x.min()). Voor 10, 20, 40 is het bereik 30: de resultaten zijn 0; ongeveer 0,333 en 1. Zowel het minimum als het maximum is nodig; alleen delen door het maximum is een andere bewerking. Een constante kolom heeft een bereik van nul, dus deze expressie kan die geen bruikbare geschaalde spreiding geven.
Standaardiseren gebruikt (x - x.mean()) / x.std(). Voor 10, 20, 30 is het gemiddelde 20 en is de standaard gebruikte steekproefstandaardafwijking van pandas 10. Als je 20 aftrekt en door 10 deelt, krijg je de z-scores -1, 0 en 1. Een z-score beschrijft de afstand tot het gemiddelde in eenheden van de standaardafwijking, geen intervallabel.
Begrens en codeer
pd.Series([5, 12, 250, 8]).clip(upper=100) geeft 5, 12, 100, 8. Anders dan een filter behoudt clip de rij en vervangt het het extreme getal. Inspecteer grote waarden met describe() of een filter voordat je ze begrenst: een echte grote meting blijft een gegeven.
pd.get_dummies(s) maakt één booleaanse indicatorkolom per categorie. Bij rood, groen, rood, blauw is elke rij alleen True in de kolom van de eigen kleur. Gebruik dtype=int voor nullen en enen. Ontbrekende waarden geven uitsluitend onware indicatoren, tenzij dummy_na=True een kolom voor ontbrekende waarden toevoegt. Bij gewone kleinste-kwadratenregressie met een intercept verwijdert drop_first=True een overbodige categoriekolom; andere modellen kunnen elke categorie behouden. Met één categorie per rij telt de volledige set indicatoren op tot de constante 1 van het intercept, wat lineaire afhankelijkheid veroorzaakt.
Voor cellen met meerdere labels splitst s.str.get_dummies(sep="|") een waarde zoals “Action|Comedy” in afzonderlijke indicatoren. Je kunt ook ingedeelde intervallen aan get_dummies doorgeven, wat een kolom voor elk bereik oplevert.
Belangrijkste punten
- Controleer bij
cutde intervalgrenzen en waarden buiten het bereik. cutbepaalt bereiken;qcutstreeft naar vergelijkbare groepsaantallen.- Min-maxschaling en z-scores behouden numerieke waarden op een gewijzigde schaal.
clipbegrenst waarden zonder rijen te verwijderen.- Indicatorkolommen geven aan tot welke categorie een rij behoort zonder een numerieke volgorde te verzinnen.
- Verwerk ontbrekende categorieën expliciet als hun indicatoren van belang zijn.
3Schoon tekst en categorische gegevens op
Tekstwaarden hebben een consistente spelling en tussenruimte nodig voordat ze als categorieën of sleutels kunnen dienen. Pas tekenreeksmethoden toe op een kolom, haal gestructureerde delen uit tekst met reguliere expressies en kies een categorisch datatype als een kleine verzameling labels zich herhaalt. De voorbeelden verbinden tekstopschoning met controles op duplicaten en samenvoegingen en laten zien hoe opgeslagen codes en de volgorde van categorieën verschillen van de woorden die je in een tabel ziet.
3.1 Maak tekstwaarden consistent
Een mens ziet dezelfde stad in “ Lisbon”, “lisbon” en “LISBON ”. pandas ziet drie verschillende tekenreeksen. Door een tekstkolom op te schonen, krijgen latere tellingen, controles op duplicaten en samenvoegingen een consistente verzameling waarden om te vergelijken.
Pas tekenreeksmethoden toe op een Series
Python's "Lima ".strip() werkt op één tekenreeks. Gebruik voor een kolom de .str-accessor: s.str.strip() verwijdert witruimte aan de buitenkant van elke aanwezige waarde. s.lower() geeft een AttributeError, omdat de Series zelf geen methode lower heeft. Gebruik s.str.lower().
pandas 3 leidt voor tekst normaal gesproken het datatype str af, dat de oudere standaard object vervangt. Het datatype str bevat tekst en ontbrekende waarden, met NaN voor ontbrekende tekst. Tekenreeksmethoden werken op beide types. Ken tekst toe aan een str-kolom; zet een getal eerst om in tekst als het daar als tekst thuishoort.
Combineer passende opschoningsbewerkingen en ken het resultaat toe:
df["city"] = df["city"].str.strip().str.lower()
De drie schrijfwijzen van Lisbon worden “lisbon”. strip() verwijdert witruimte aan de buitenkant, geen spaties binnen een naam. upper() maakt alle letters hoofdletters, terwijl title() elk woord met een hoofdletter schrijft en “new york” omzet in “New York”. Kies één consistente vorm voor sleutels en tellingen.
Splits gestructureerde tekenreeksen
Voor “Silva, Ana” en “Tanaka, Yui” geeft s.str.split(", ") lijsten terug zoals ["Silva", "Ana"]. Voeg expand=True toe om afzonderlijke kolommen te maken. Haal met .str[0] of .str.get(1) een deel uit elke lijst op.
Gebruik n=1 als alleen het eerste scheidingsteken een waarde moet splitsen. Als je “a,b,c” met n=1 bij komma's splitst, krijg je “a” en “b,c”. Zonder limiet krijg je drie delen. Gebruik exact het juiste scheidingsteken, inclusief eventuele spaties die bij het formaat horen.
Zoek en filter
s.str.contains("lis", case=False) controleert of tekst ergens voorkomt en negeert daarbij het verschil tussen hoofdletters en kleine letters. s.str.startswith("ID") controleert het begin; s.str.endswith(".csv") controleert het einde. Met de booleaanse resultaten kun je rijen selecteren:
mask = df["city"].str.contains("san", case=False, na=False)
selected = df[mask]
Bij het str-datatype van pandas 3 geeft ontbrekende tekst in deze zoektests False. Door na=False te schrijven maak je ook duidelijk hoe je ontbrekende waarden wilt behandelen bij tekenreeksgegevens die ontbrekende waarden ondersteunen. contains leest standaard een regex-patroon; voeg regex=False toe voor letterlijke tekst met speciale tekens.
Vervang delen en maak nieuwe tekenreeksen
s.str.replace("kg", "", regex=False) verwijdert “kg” overal waar het voorkomt. s.replace("kg", "") wijzigt alleen cellen die precies “kg” zijn. Dit verschil is van belang voor waarden zoals “12 kg”.
str.replace behandelt de zoektekst standaard letterlijk. Voor “3.5 kg” verwijdert .str.replace(".", "", regex=False) de punt en geeft het “35 kg”. Met regex=True is de punt een patroon voor bijna elk teken en verwijdert de methode in dit voorbeeld van één regel alle tekens. Gebruik die wijziging nooit om een decimale meting in te lezen.
s.str.len() telt tekens; een ontbrekende waarde levert NaN op en kan van het resultaat een float-kolom maken. s.str[:3] haalt de eerste drie tekens op. Om kolommen te combineren voegt df["first"] + " " + df["last"] Ana en Silva samen tot “Ana Silva”; str.cat is een andere methode om samen te voegen. Elke bewerking geeft een resultaat terug, dus sla dat op in de kolom die je wilt gebruiken.
Belangrijkste punten
- Gebruik
.strom tekstmethoden op een Series toe te passen. - Verwijder witruimte aan de buitenkant en standaardiseer het hoofdlettergebruik voordat je tekstsleutels vergelijkt.
- Bepaal de uitvoer van splitsen met
expandenn. - Kies bij speciale tekens expliciet voor letterlijk zoeken of zoeken met een reguliere expressie.
- Ken opgeschoonde tekst opnieuw toe om de wijziging te behouden.
3.2 Haal de delen op die een tekstpatroon beschrijft
Een reguliere expressie, of regex, beschrijft een patroon in tekst. Daarmee kun je een hoeveelheid herkennen, ook als het aantal cijfers of de tussenruimte varieert. Begin met een klein patroon waarvan je de onderdelen kunt uitleggen.
Lees de onderdelen van het patroon
| Patroon | Betekenis |
|---|---|
\d | Eén cijfer |
\w | Een woordteken: een letter, cijfer of onderstrepingsteken |
\s | Eén witruimteteken |
[A-Z] | Eén hoofdletter in dit bereik |
+ | Eén of meer van het voorafgaande onderdeel |
* | Nul of meer van het voorafgaande onderdeel |
? | Het voorafgaande onderdeel is optioneel |
{4} | Precies vier herhalingen |
(…) | Een vastleggroep |
Schrijf Python-patronen als ruwe tekenreeksen, zoals r"\d+", zodat Python de backslashes behoudt. Een punt komt standaard overeen met elk teken behalve een nieuwe regel. Schrijf die als r"\." om een echte punt te vinden. Bij zoeken naar gewone tekst voorkomt regex=False dat de tekst als patroon wordt geïnterpreteerd.
Kies hoeveel tekst moet overeenkomen
contains vindt een patroon overal in de tekst, match begint aan het begin en fullmatch vereist dat de hele waarde overeenkomt. Voor “123a” slagen s.str.contains(r"\d+") en s.str.match(r"\d+"), maar mislukt s.str.fullmatch(r"\d+"). Gebruik de test voor de hele tekenreeks als je een volledige code controleert. Met case=False of flags=re.IGNORECASE na import re kun je hoofdletterongevoelig zoeken waar dat wordt ondersteund.
Leg een meting vast
Neem “Rice 5 kg”, “Flour 2kg”, “Salt” en “Beans 12 kg, 3 kg”. Het patroon r"(\d+)\s*kg" betekent één of meer cijfers vastgelegd als groep, gevolgd door nul of meer spaties en dan “kg”.
quantity = s.str.extract(r"(\d+)\s*kg", expand=False)
quantity = pd.to_numeric(quantity)
De opgehaalde tekenreeksen zijn “5”, “2”, een ontbrekende waarde en “12”. Conversie geeft de numerieke waarden 5,0, 2,0, NaN en 12,0. extract neemt de eerste overeenkomst in elke rij, dus de tweede hoeveelheid in de beschrijving van de bonen wordt niet meegenomen. Zonder expand=False geeft één groep een DataFrame met één kolom terug.
Benoemde groepen geven de uitvoer een naam. s.str.extract(r"(?P<year>\d{4})-(?P<month>\d{2})") vindt “2024-03” in “Report 2024-03 final” en geeft de tekstkolommen year en month terug. Het patroon herkent de indeling van de cijfers; numerieke conversie is een afzonderlijke stap.
Vind elke overeenkomst of schoon op met een patroon
findall(r"\d+") geeft een lijst per rij, waaronder ["12", "3"] voor de bonentekst en [] voor “Salt”. count(r"\d+") telt overeenkomsten. extractall geeft één rij per overeenkomst met een extra indexniveau genaamd match.
Met regex=True brengt s.str.replace(r"\s+", " ", regex=True) reeksen witruimte terug tot één spatie. r"\D" betekent een teken dat geen cijfer is, dus als je die tekens verwijdert, wordt “+351 912-345-678” omgezet in “351912345678”. De hoofdlettervormen \S en \W zijn op vergelijkbare wijze de ontkenning van de klassen voor witruimte en woordtekens.
Herhaling is standaard gretig. In "<b>x</b>" loopt r"<.*>" van het eerste openingsteken tot het laatste sluitingsteken. Als je die overeenkomst verwijdert, verdwijnt alles. Het luie patroon r"<.*?>" komt overeen met elke tag afzonderlijk en laat “x” achter. Controleer voorbeelduitvoer voordat je een patroon op een hele kolom gebruikt.
Belangrijkste punten
- Gebruik ruwe tekenreeksen om backslashes in reguliere expressies te behouden.
- Kies
contains,matchoffullmatchvoor de bedoelde reikwijdte. - Vastleggroepen geven tekst terug; converteer opgehaalde getallen afzonderlijk.
extractneemt de eerste overeenkomst;findallenextractallbehouden meerdere overeenkomsten.- Zet een backslash voor speciale tekens om ze letterlijk te zoeken met een reguliere expressie.
- Controleer gretige patronen met voorbeelden die meerdere mogelijke overeenkomsten bevatten.
3.3 Sla herhaalde labels op als categorieën
Een kolom met enkele waarden die vaak worden herhaald, kan het datatype category gebruiken. Dat slaat de unieke labels eenmaal op en geeft elke rij weer met een kleine gehele code. De zichtbare waarde blijft het label.
Begrijp categorieën en codes
Voor de maten M, S, L, M, M leidt s.astype("category") de categorieën L, M, S af in alfabetische volgorde. De codes zijn 1, 2, 0, 1, 1. Gebruik s.cat.categories om de labels te inspecteren en s.cat.codes om de identificatiecodes te inspecteren. Een code 0 betekent de eerste opgeslagen categorie; het is geen gemeten hoeveelheid.
Bij herhaalde labels kun je aanzienlijk op geheugen besparen. Tot en met 126 categorieën gebruikt elke code één byte; bij 127 categorieën zijn dat twee bytes. In een pandas 3.1-omgeving met PyArrow gebruikten drie landnamen die over 3.000.000 rijen werden herhaald ongeveer 3 MB als categorische gegevens, ongeveer 42 MB als str en ongeveer 165 MB als object. De gebruikte methode voor tekstopslag beïnvloedt deze cijfers. Een kolom met bijna uitsluitend unieke waarden heeft geen voordeel van een categorielijst plus een code per rij.
Definieer een betekenisvolle volgorde
In alfabetische volgorde komt L vóór M en S. Definieer de werkelijke volgorde van de maten expliciet:
size_type = pd.CategoricalDtype(["S", "M", "L"], ordered=True)
sizes = s.astype(size_type)
Nu volgt sorteren de volgorde S, M, L, zijn vergelijkingen zoals sizes > "S" betekenisvol en is sizes.max() “L” als L voorkomt. Voor ongeordende labels zoals landen werken gelijkheidsvergelijkingen, maar groter-danvergelijkingen geven een TypeError. as_ordered() gebruikt de bestaande volgorde van categorieën; inspecteer die voordat je die volgorde als betekenisvol aanmerkt.
Wijzig de toegestane labels
Je kunt “XL” niet toekennen aan een categorische kolom die alleen S, M en L toestaat. Ken eerst het uitgebreide resultaat toe, sizes = sizes.cat.add_categories("XL"), en ken daarna de nieuwe waarde toe.
Als je tekst naar een vaste categorielijst converteert, kunnen waarden die niet in de lijst staan ontbrekend worden. pandas 3.1 waarschuwt dat deze conversie met gegevensverlies een fout zal worden. Controleer de bronwaarden vóór de conversie met value_counts(), vooral nadat je schrijfwijzen hebt opgeschoond.
De .cat-methoden hebben verschillende doelen:
rename_categories({"S": "small"})wijzigt een label en behoudt de bijbehorende waarden.remove_categories("L")verwijdert een toegestaan label en maakt bestaande L-waarden ontbrekend.set_categories([...])vervangt de hele categorielijst.reorder_categories([...], ordered=True)wijzigt de volgorde zonder te wijzigen welke labels zijn toegestaan.remove_unused_categories()verwijdert labels waartoe momenteel geen waarden behoren.
value_counts() toont elke toegestane categorie, ook die met nul waarnemingen. Bij een S/M/L-type dat alleen S en M bevat, verschijnt L nog steeds met aantal 0. Zo wordt een lege groep zichtbaar waarvoor gewone tekstgegevens geen label hebben opgeslagen.
Houd categorieën bruikbaar in latere stappen
cut levert categorische intervallen op en get_dummies zet categorielidmaatschap om in indicatorkolommen. Als je ongeordende landcodes als getallen aan een model geeft, leg je een kunstmatige volgorde en afstand op. Indicatoren voorkomen die interpretatie.
Als je categorische kolommen met verschillende categorielijsten concateneert, gaat het categorische datatype normaal gesproken verloren. Stem hun categorielijsten eerst op elkaar af of gebruik in pandas 3.1 pd.concat(..., union_categories=True) als het de bedoeling is de lijsten te combineren. Inspecteer zowel het resulterende datatype als de volgorde van de categorieën.
Belangrijkste punten
- Categorische kolommen slaan een lijst met labels en gehele identificatiecodes op.
- Definieer de volgorde van categorieën expliciet als een rangorde betekenis heeft.
- Voeg een categorie toe voordat je een nieuw label toekent.
- Als je een gebruikte categorie verwijdert, worden de bijbehorende waarden ontbrekend.
- Gebruik indicatoren voor ongeordende categorieën in numerieke modellen.
- Stem categorielijsten op elkaar af of verenig ze bewust vóór concatenatie.
4Combineer DataFrames
Tabellen combineren kan informatie toevoegen, waarnemingen toevoegen of ontbrekende waarden vanuit een reservebron aanvullen. Dat zijn verschillende taken. Koppel expliciete sleutels met merge, werk met indexlabels via join en combine_first en stapel passende delen met concat. Voorspel voordat je een resultaat vertrouwt welke rijen behouden moeten blijven en hoeveel overeenkomsten elke sleutel moet opleveren; de voorbeelden laten zien waarom onverwachte groei vaak begint bij een herhaalde opzoeksleutel.
4.1 Voorspel wat een samenvoeging behoudt
Een samenvoeging koppelt rijen via sleutelwaarden en plaatst hun informatie naast elkaar. De sleutel moet in beide tabellen hetzelfde aanduiden, zoals de klant-ID op een bestelling en de klant-ID in een opzoektabel.
Benoem de sleutel en kies de join
Gebruik orders.merge(customers, on="customer_id"). Zonder on gebruikt pandas alle kolomnamen die beide tabellen delen. Een gedeelde kolom zonder verband, zoals date, zou dan geldige klantkoppelingen kunnen verhinderen.
Stel dat bestellingen de klant-ID's 10, 20, 20, 30, 50 hebben. De klantentabel heeft elk één rij voor 10, 20, 30, 40.
how | Wat blijft behouden | Aantal resultaatrijen |
|---|---|---|
"inner" | Overeenkomende sleutels aan beide kanten | 4 |
"left" | Elke linkerrij en de bijbehorende overeenkomsten | 5 |
"right" | Elke rechterrij en de bijbehorende overeenkomsten | 5 |
"outer" | Sleutels van beide kanten | 6 |
"cross" | Elk paar van een linker- en rechterrij | 20 |
Inner is de standaardinstelling. Bij een left join ontbreken de klantgegevens voor klant 50. Een right join bevat klant 40 zonder bestelling, plus beide bestellingen voor 20. Een outer join bevat beide sleutels zonder overeenkomst. Een cross join heeft geen sleutel nodig, omdat die bewust elke rij koppelt. pandas 3 biedt ook left_anti en right_anti voor rijen zonder overeenkomende sleutel aan de andere kant.
Controleer hoeveel overeenkomsten een rij kan hebben
Twee linkerrijen voor sleutel 20 en drie rechterrijen voor sleutel 20 leveren zes paren op. De samenvoeging kiest niet één rechterrij. Als je in het voorbeeld een tweede rij voor klant 20 aan de opzoektabel toevoegt, groeit het inner-resultaat van vier naar zes rijen.
Geef de bedoelde relatie aan met validate:
merged = orders.merge(
customers, on="customer_id", how="left",
validate="many_to_one"
)
Dit staat veel bestellingen per klant toe, maar vereist unieke klant-ID's aan de rechterkant. Een herhaalde rechtersleutel geeft een MergeError. one_to_one vereist uniciteit aan beide kanten; one_to_many vereist die aan de linkerkant. many_to_many staat herhalingen aan beide kanten toe en controleert de uniciteit niet.
Onderzoek rijen zonder overeenkomst
Een outer join met indicator=True voegt _merge toe. Hier zijn de aantallen vier both, één left_only en één right_only. Dit zijn rijen, geen unieke sleutels: herhaalde bestellingen kunnen voor één klant meerdere both-rijen opleveren.
Gebruik m.loc[m["_merge"] == "left_only", "customer_id"].nunique() om unieke sleutels zonder overeenkomst aan de bestelkant te tellen. Door de rijen te inspecteren kun je ontbrekende vermeldingen in de opzoektabel of inconsistente tekst ontdekken.
Bepaal namen en sleutelformaten
Als sleutels verschillende namen hebben, gebruik je left_on="customer_id", right_on="id". Beide sleutelkolommen blijven beschikbaar. Je kunt meerdere sleutels samen vergelijken met on=["city", "year"]; beide moeten overeenkomen.
Overlappende namen van kolommen die geen sleutel zijn krijgen _x en _y. Kies betekenisvolle achtervoegsels zoals suffixes=("_order", "_ship") om de herkomst duidelijk te houden.
Sleutels hebben compatibele datatypes en gelijke waarden nodig. De numerieke waarde 1 kan overeenkomen met de numerieke waarde 1,0, maar een gehele sleutelkolom en een tekstsleutelkolom kunnen bij het samenvoegen een fout geven. Converteer hun formaten bewust. “ana” en “Ana ” verschillen als tekst; standaardiseer het hoofdlettergebruik en de spaties aan de buitenkant vóór het samenvoegen als ze dezelfde persoon aanduiden.
Ook ontbrekende sleutels moet je inspecteren: pandas koppelt ontbrekende sleutels aan de ene kant aan ontbrekende sleutels aan de andere kant. Als beide kanten meerdere van zulke rijen bevatten, kunnen ook die overeenkomsten zich vermenigvuldigen.
Belangrijkste punten
- Benoem samenvoegsleutels expliciet.
- Kies het type join op basis van de bronrijen die behouden moeten blijven.
- Herhaalde sleutels leveren elk overeenkomend paar op.
- Gebruik
validateom de bedoelde sleutelrelatie te controleren. - Gebruik een outer join met een herkomstindicator om rijen zonder overeenkomst te inspecteren.
- Controleer sleutelwaarden, formaten en achtervoegsels voordat je het resultaat gebruikt.
4.2 Combineer waarden met overeenkomende indexlabels
Een index kan de sleutel bevatten waarop je wilt koppelen. pandas gebruikt die labels bij het koppelen van tabellen, het aanvullen van ontbrekende waarden of het optellen van twee Series. De rijpositie alleen bepaalt de overeenkomsten niet.
Koppel op indexlabels
left.join(right) koppelt de twee indexen en gebruikt standaard een left join. Daarentegen gebruikt merge standaard een inner join. Je kunt ook left.merge(right, left_index=True, right_index=True) schrijven als beide sleutels in de index staan.
Stel dat stations de indexlabels A, B, C en de hoogtes 120, 850, 15 m heeft. Een metingentabel heeft de stationindexlabels A, B, B, D. readings.join(stations) behoudt vier rijen en voegt de hoogtes 120, 850, 850 en NaN toe. Beide B-metingen krijgen de hoogte van B. Met how="inner" blijven alleen de drie metingen van A en B behouden.
Als de metingen station-ID's in een gewone kolom bewaren, gebruik je readings.join(stations, on="station"). De linkerkolom wordt gekoppeld aan de rechterindex. De overeenkomstige vorm met merge is readings.merge(stations, left_on="station", right_index=True, how="left").
Maak de plaats van de sleutel duidelijk
set_index("station") verplaatst de stationskolom naar de index. reset_index() zet die terug als gewone kolom. Zo kun je een indeling kiezen waarin de koppeling eenvoudig te inspecteren is. left.join([t1, t2]) kan meerdere tabellen met gemeenschappelijke indexlabels tegelijk koppelen.
Als beide gekoppelde tabellen een kolom bevatten die geen sleutel is, zoals source, geeft join een ValueError tenzij je de namen onderscheidt. Schrijf in pandas 3.1 suffixes=("_left", "_right"); dit vervangt de oudere argumenten lsuffix en rsuffix. De achtervoegsels behouden beide versies zonder te bepalen welke waarde leidend is.
Vul ontbrekende waarden aan vanuit een reservebron
a.combine_first(b) behoudt bekende waarden in a, vult de ontbrekende waarden aan vanuit b bij overeenkomende labels en neemt labels op die alleen in b voorkomen.
| Label | a | b | a.combine_first(b) |
|---|---|---|---|
| a | 1 | 10 | 1 |
| b | NaN | 20 | 20 |
| c | 3 | 30 | 3 |
| d | afwezig | 40 | 40 |
Het resultaat behoudt 1 en 3 omdat de eerste bron die al kent. Het gebruikt 20 om de ontbrekende waarde aan te vullen en voegt label d met 40 toe. Als je de aanroep omdraait, verandert welke bron voorrang heeft. Dit is nuttig als een hoofdbron voorrang moet krijgen op een reservebron, ook wanneer hun rijvolgorde verschilt.
Herken uitlijning bij berekeningen
Laat x de waarden a = 5 en b = 7 hebben en y de waarden b = 1 en c = 2. x + y geeft b = 8, met ontbrekende resultaten bij a en c omdat bij elk één operand ontbreekt. De eerste waarde van x wordt niet bij de eerste waarde van y opgeteld.
x.add(y, fill_value=0) vult de ontbrekende kant aan met nul en levert a = 5, b = 8, c = 2 op. Gebruik die regel als een afwezige bijdrage als nul moet tellen. Uitlijning op labels is het gemeenschappelijke principe achter deze bewerkingen, maar hun regels voor waarden verschillen: join voegt kolommen toe, combine_first vult ontbrekende waarden aan en rekenen gebeurt met overeenkomende waarden.
Belangrijkste punten
joinkoppelt standaard indexen met een left join;mergegebruikt standaard inner.- Bij
join(on="station")wordt de linkerkolom gekoppeld aan de rechterindex. - Gebruik achtervoegsels om overlappende kolommen die geen sleutel zijn te onderscheiden.
combine_firstgeeft voorrang aan bekende waarden in het object waarop de methode wordt aangeroepen.- Berekeningen worden uitgelijnd op label;
fill_valuebepaalt hoe ontbrekende bijdragen worden verwerkt.
4.3 Stapel passende tabellen met concat
Maandbestanden bevatten meestal meer rijen met hetzelfde soort waarneming. Concatenatie verzamelt die delen in één tabel. Daarbij worden labels op de andere as uitgelijnd; er wordt niet gezocht naar overeenkomende klant- of bestelsleutels.
Stapel rijen en lijn kolommen uit
pd.concat([jan, feb]) stapelt rijen omdat axis=0 de standaardinstelling is. Stel dat januari drie ritten heeft met de kolommen trip en km, terwijl februari twee ritten heeft met trip, km en note. Het resultaat heeft vijf rijen en drie kolommen. De ontbrekende cellen van januari in note worden NaN.
join="outer" is de standaardinstelling: die behoudt de vereniging van kolomnamen. join="inner" behoudt alleen gemeenschappelijke namen, zodat het resultaat vijf rijen en de twee kolommen trip en km heeft. Het bevat nog steeds alle vijf waarnemingen; de joininstelling bepaalt wat er op de andere as gebeurt.
De kolomvolgorde in de delen bepaalt de koppeling niet. De exacte namen doen dat wel. Als het ene deel km gebruikt en het andere Km, bevat het resultaat twee gedeeltelijk lege kolommen. Hernoem de kolomkoppen vóór de concatenatie.
Bepaal wat de rijlabels moeten betekenen
De oorspronkelijke indexen blijven standaard behouden. Met beginindexen 0, 1, 2 en 0, 1 herhaalt het resultaat de labels 0 en 1. result.loc[0] selecteert twee rijen. Gebruik ignore_index=True als die getallen geen betekenis hebben en je nieuwe labels van 0 tot en met 4 wilt.
Als de herkomst van belang is, gebruik je een buitenste indexniveau:
result = pd.concat(
[jan, feb], keys=["jan", "feb"], names=["month", "row"]
)
Nu selecteert result.loc["feb"] de twee rijen van februari. keys bewaart de herkomst binnen een MultiIndex. In pandas 3 geeft de combinatie van keys met ignore_index=True een ValueError; kies voor die bewerking herkomstlabels of een nieuwe gewone index.
Plaats kolommen naast elkaar
pd.concat([x, y], axis=1) lijnt rijen uit op indexlabel. Voor x met a = 1, b = 2 en y met b = 3, c = 4 heeft het resultaat de rijen a, b, c. De kolom x ontbreekt bij c en y bij a. Met join="inner" blijft alleen b over.
| Bewerking | Toegevoegd langs | Labels uitgelijnd op |
|---|---|---|
concat(..., axis=0) | Rijen | Kolomnamen |
concat(..., axis=1) | Kolommen | Rijindexen |
merge(..., on="id") | Overeenkomende rijparen | Waarden in sleutelkolommen |
Controleer opslag en verzamel delen efficiënt
Een kolom die numerieke waarden en tekst mengt, kan het datatype object krijgen. Als gewone NumPy-gegevens van het type int64 een ontbrekende waarde krijgen, worden ze float64; pandas-"Int64" kan gehele getallen met <NA> behouden. Stem datatypes vóór het combineren op elkaar af als de kolom een vastgelegd type heeft.
DataFrame.append is in pandas 2.0 verwijderd. Verzamel voor veel bestanden DataFrames in een lijst en roep pd.concat na de lus één keer aan. Als je in elke iteratie een groeiend resultaat opnieuw opbouwt, kopieer je de verzamelde gegevens steeds opnieuw en wordt het traag.
Controleer of de lengte van een rijconcatenatie gelijk is aan de som van de invoerlengtes. Inspecteer daarna kolomnamen, aantallen ontbrekende waarden en datatypes.
Belangrijkste punten
- Rijconcatenatie lijnt kolomnamen uit en telt de aantallen invoerrijen op.
joinkiest gemeenschappelijke of alle labels op de andere as.- Gebruik
ignore_indexvoor labels die je niet hoeft te bewaren ofkeysvoor de herkomst. - Kolomconcatenatie lijnt rijindexen uit.
- Verzamel eerst veel delen en concateneer ze één keer.
5Herstructureer gegevens met hiërarchische indexen, pivot en melt
Dezelfde metingen kun je ordenen als rijen, kolommen of niveaus van een index. Gebruik een MultiIndex om waarnemingen met meerdere sleutels aan te duiden en verplaats die sleutels daarna met stack en unstack of met pivot en melt. Houd bij welke labels een cel identificeren en of ze uniek zijn. Zo wordt herstructureren voorspelbaar en kun je een ontbrekende combinatie onderscheiden van een gemeten nul of een paar records dat expliciet moet worden geaggregeerd.
5.1 Selecteer rijen met meer dan één indexniveau
Een MultiIndex geeft elke rij meerdere labels. Een verkooprij kan worden geïdentificeerd door zowel stad als jaar, geschreven als een tuple zoals ("Osaka", 2024). Elk label heeft een niveau en de volgorde van die niveaus is van belang bij het selecteren.
Maak en benoem de index
df.set_index(["city", "year"]) verplaatst die kolommen naar de index. pd.MultiIndex.from_product([["Lima", "Osaka"], [2024, 2025]], names=["city", "year"]) maakt elke combinatie van de opgegeven labels. Concatenatie met keys voegt ook een niveau toe.
Voor de voorbeelden heeft sales deze indexparen en waarden:
| city | year | sales |
|---|---|---|
| Osaka | 2024 | 120 |
| Osaka | 2025 | 135 |
| Lima | 2024 | 80 |
| Lima | 2025 | 95 |
Na het instellen van de twee indexniveaus is df.index.names gelijk aan ["city", "year"]. rename_axis(["town", "yr"]) wijzigt de namen van de niveaus zonder hun waarden te wijzigen.
Selecteer een buitenste label of een volledige tuple
df.loc["Osaka"] selecteert beide rijen van Osaka. Het geselecteerde stadsniveau valt weg, zodat 2024 en 2025 als index overblijven. df.loc[("Lima", 2025), "sales"] selecteert één cel en geeft 95 terug.
Eén label dat je aan loc doorgeeft, zoekt op het buitenste niveau. df.loc[2024] zoekt daarom naar een stad met de naam 2024 en geeft in deze tabel een KeyError. Gebruik df.xs(2024, level="year") om een jaar over alle steden heen te selecteren. Dit geeft 120 voor Osaka en 80 voor Lima terug, met stad als overblijvende index.
Voor een algemenere selectie behoudt df.loc[pd.IndexSlice[:, 2025], :] alle steden voor het jaar 2025. De dubbele punt op de eerste positie betekent alle labels op dat niveau; de laatste dubbele punt selecteert alle kolommen.
Sorteer voordat je een deelbereik selecteert
Voor selectie op een exact label hoeft niet de hele index gesorteerd te zijn, maar voor een deelbereik van labels is passende sortering nodig. Gebruik df.sort_index() vóór df.loc["Lima":"Osaka"]. Een ongesorteerde MultiIndex kan bij zo'n deelbereik een UnsortedIndexError geven.
sort_index() sorteert alle niveaus in hun huidige volgorde, dus eerst de steden en binnen elke stad de jaren. sort_index(level="year") sorteert op het genoemde niveau. swaplevel("city", "year") plaatst jaar op de buitenste positie; gebruik daarna sort_index() om de nieuwe indeling te groeperen en te sorteren. Alleen de posities van de niveaus verwisselen sorteert de rijen niet.
Verplaats labels terug naar kolommen
reset_index() zet beide niveaus terug als kolommen. reset_index(level="year") zet alleen jaar terug en laat stad als index staan. Met deze bewerkingen kun je een tabel voorbereiden om samen te voegen of op te slaan zonder de identificerende waarden te verliezen.
Ook kolommen kunnen meerdere niveaus hebben. Een herstructurering met verkoop- en personeelswaarden kan kolomlabels zoals ("sales", 2024) en ("staff", 2025) opleveren. df["sales"] selecteert alle kolommen onder het bovenste label sales.
Voor een totaal per stad geeft df.groupby(level="city")["sales"].sum() Lima 175 en Osaka 255. Gebruik groepering voor deze samenvatting; het oude argument sum(level="city") is in pandas 2.0 verwijderd.
Belangrijkste punten
- Een tuple identificeert een volledig MultiIndex-label over de niveaus heen.
- Selectie met één label via
locbegint op het buitenste niveau. - Gebruik
xsofIndexSliceom op een binnenste niveau te selecteren. - Sorteer de index voordat je een deelbereik van labels selecteert.
- Verwissel niveaus om hun rol te wijzigen en stel ze opnieuw in om kolommen terug te krijgen.
- Gebruik
groupby(level=...)voor samenvattingen per indexniveau.
5.2 Verplaats labels tussen de index en kolommen
stack en unstack veranderen waar labels staan. Waarden behouden hun identificerende combinatie, maar de tabel kan combinaties zichtbaar maken waarvoor geen waarneming bestaat.
Verplaats kolomlabels naar de index met stack
Stel dat een breed DataFrame de steden Osaka en Lima als index en de jaren 2024 en 2025 als kolommen heeft. Osaka heeft de waarden 120 en 135; Lima heeft 80 en 95. Noem de assen city en year om hun betekenis zichtbaar te houden.
long = wide.stack() verplaatst de jaarlabels naar een nieuw binnenste indexniveau. Met deze kolommen met één niveau is het resultaat een Series met vier waarden:
("Osaka", 2024)geeft 120.("Osaka", 2025)geeft 135.("Lima", 2024)geeft 80.("Lima", 2025)geeft 95.
De stadslabels worden herhaald omdat elke stad nu één rij per jaar heeft. Bij het stapelen zijn de waarden niet opgeteld en zijn geen extra metingen gemaakt.
Verplaats een indexniveau naar kolommen met unstack
long.unstack() verplaatst het binnenste indexniveau, jaar, naar kolommen en herstelt de brede indeling. long.unstack("city") verplaatst in plaats daarvan stad, met jaren als rijen en steden als kolommen. Een numerieke niveaupositie zoals unstack(0) kan hetzelfde niveau selecteren, maar een naam maakt de bedoeling makkelijker leesbaar.
| Bewerking | Verplaatsing van labels |
|---|---|
stack() | Een kolomniveau wordt een binnenste indexniveau |
unstack() | Een indexniveau wordt een kolomniveau |
Als de invoer hiërarchische kolommen heeft, kan na het stapelen van één niveau een ander niveau als kolommen overblijven. Voor kolommen zoals ("sales", 2024) en ("staff", 2024) geeft stack("year") een DataFrame met verkoop- en personeelskolommen terug. Het stapelen van alle kolomniveaus geeft een Series terug.
Houd ontbrekende combinaties zichtbaar
Stel nu dat de lange Series geen waarde voor Lima in 2025 heeft. Bij unstack ontstaat een rechthoekige tabel van stad bij jaar, waardoor op die plaats NaN wordt ingevoegd. Gewone gehele waarden worden floats als deze ontbrekende cel een float-markering voor ontbrekende waarden vereist.
unstack(fill_value=0) kan een nieuw ontbrekende combinatie met nul vullen. Gebruik dit alleen als afwezigheid nul betekent, zoals geen geregistreerde verkopen in een volledige dataset met verkoopgebeurtenissen. Een ontbrekende sensorwaarneming is onbekend en moet ontbreken blijven.
stack() in pandas 3 behoudt ontbrekende cellen. Het stapelen van de onvolledige tabel van 2 × 2 geeft daarom vier waarden terug, inclusief NaN. Voeg .dropna() toe als je alleen de drie bekende waarden wilt. Door ontbrekende waarden te verwijderen verandert welke combinaties vertegenwoordigd blijven, dus controleer de lengte van het resultaat.
Los dubbele combinaties eerst op
Unstack heeft één waarde per volledige indexcombinatie nodig. Twee waarden met het label ("Lima", 2025) moeten in dezelfde uitvoercel komen en geven de fout ValueError: Index contains duplicate entries, cannot reshape.
Gebruik long.index.duplicated() om herhaalde volledige labels te inspecteren, of controleer de bijbehorende sleutelkolommen voordat je de index instelt. Bepaal of de rijen onbedoelde kopieën zijn of afzonderlijke waarnemingen die moeten worden gecombineerd. Ze verwijderen of aggregeren is een beslissing over de gegevens; unstack kiest geen regel voor je.
Belangrijkste punten
stackverplaatst kolomlabels naar binnen;unstackverplaatst indexlabels naar buiten.- Kies het niveau expliciet als de standaardinstelling niet het benodigde niveau is.
- Afwezige combinaties verschijnen bij omzetting naar breed formaat als ontbrekende cellen.
- Bij stack in pandas 3 blijven ontbrekende waarden behouden, tenzij je ze achteraf verwijdert.
- Elke volledige indexcombinatie moet uniek zijn voor unstack.
5.3 Zet tabellen om tussen lang en breed formaat
In lang formaat staan identificerende kolommen naast één waardekolom. In breed formaat zijn metingen verdeeld over kolommen, zoals één kolom per jaar. Kies de indeling die de volgende taak eenvoudig maakt: lange tabellen zijn geschikt voor filteren en groeperen, terwijl brede tabellen vergelijking naast elkaar ondersteunen.
Zet unieke combinaties met pivot om in cellen
Een lange tabel met de kolommen city, year en sales wordt breed met df.pivot(index="city", columns="year", values="sales"). Stadslabels vormen rijen, jaren vormen kolommen en verkopen vullen de cellen. Dit is gelijk aan df.set_index(["city", "year"])["sales"].unstack().
De verkopen van Osaka in 2024 en 2025, 120 en 135, worden twee cellen in één rij. De waarden 80 en 95 van Lima vormen de tweede rij. Als je de argumenten index en columns verwisselt, transponeer je deze indeling. Als je values weglaat, worden alle overige gegevenskolommen omgezet en kunnen hiërarchische kolommen ontstaan, zoals een verkoopniveau en een personeelsniveau boven de jaren.
Bepaal of herhalingen fouten of waarnemingen zijn
pivot herschikt waarden en kan ze niet combineren. Twee rijen voor Lima in 2025 zouden twee waarden in één uitvoercel vereisen en geven daarom een ValueError. Tel herhaalde combinaties met df.duplicated(subset=["city", "year"]).sum().
Als afzonderlijke waarnemingen moeten worden gecombineerd, gebruik je pivot_table met een gekozen aggregatie. Voor de waarden 95 en 105 bij Lima in 2025 geeft het standaardgemiddelde 100,0. Met aggfunc="sum" is de cel 200. Als elke combinatie één keer had moeten voorkomen, blijf dan pivot gebruiken zodat een gegevensfout zichtbaar wordt in plaats van ongemerkt te worden samengevat.
Zet met melt meetkolommen om in rijen
Stel dat een CSV de kolommen city, 2023, 2024 en 2025 geeft. De waarden van Osaka zijn 110, 120, 135; die van Lima zijn 70, 80, 95. Zet de jaarkolommen om:
long = wide.melt(
id_vars="city", var_name="year", value_name="sales"
)
id_vars blijft staan en wordt herhaald. Elk label van een meetkolom wordt een jaarwaarde; elke cel wordt een verkoopwaarde. Twee rijen en drie meetkolommen leveren zes lange rijen op, waaronder een rij zoals Osaka, “2023”, 110. Ook ontbrekende meetcellen worden rijen, tenzij je die achteraf verwijdert.
Omdat deze kolomlabels uit CSV-tekst kwamen, zijn de resulterende jaren tekst. Gebruik long["year"] = long["year"].astype(int) voordat je ermee rekent. Gehele kolomlabels in de invoer zouden al gehele jaarwaarden opleveren.
Bepaal wat melt omzet en herstel de vorm
value_vars=["2024", "2025"] beperkt de omzetting tot die kolommen. Als je id_vars vergeet, kunnen stadsnamen in dezelfde waardekolom als de metingen terechtkomen. Maak altijd onderscheid tussen identificatiekolommen en kolommen die waarden bevatten.
Zonder expliciete namen heet de waardekolom value. De variabelekolom neemt wide.columns.name over of heet variable als die naam leeg is. Expliciete var_name en value_name maken het resultaat makkelijker te gebruiken.
Zet de zes rijen met index="city", columns="year", values="sales" terug om de drie jaarkolommen te herstellen. Na pivot is stad de index en heet de kolomas jaar. reset_index() herstelt stad als kolom en rename_axis(columns=None) verwijdert de naam van de kolomas. Controleer zowel de vorm als de labels voordat je de tabel samenvoegt of opslaat.
Belangrijkste punten
- Lang formaat plaatst meetlabels in rijen; breed formaat plaatst ze in kolommen.
pivotvereist unieke rij-kolomcombinaties en voert geen aggregatie uit.pivot_tablecombineert herhaalde combinaties met de gekozen aggregatie.meltherhaalt identificatiewaarden en maakt één rij per meetcel.- Controleer de types van kolomlabels als die waarden worden.
- Stel indexen en asnamen opnieuw in als een platte uitvoertabel nodig is.
Gegevens bewerken met pandas: voorbeelden
1Schoon metingen op zonder hun betekenis te verliezen
16 stappen
- 1IntroductieBepaal wat elke ontbrekende waarde betekent
Een weertabel heeft vier steden en twee meetkolommen: temperatuur in °C en neerslag in mm. Sommige metingen ontbreken. Je gaat die ontbrekende waarden opsporen, bepalen welke rijen bruikbaar zijn en een herhaald record onderscheiden van een werkelijk andere waarneming. Het bruikbare resultaat is een tabel waarvan de overgebleven waarden nog steeds betekenen wat je denkt dat ze betekenen. Gebruik
import pandas as pdenimport numpy as npvoor de code. - 2UitlegHerken de markering voor een ontbrekende waarde
Een ontbrekende waarde kan verschijnen als
NaN,NaTofpd.NA, afhankelijk van het datatype. OokNonewordt als ontbrekend herkend.Gebruik
df.isna()om een booleaanse tabel te maken metTrueop elke plaats waar een waarde ontbreekt. Een vergelijking metnp.nanmist die waarden omdat NaN zelfs niet gelijk is aan zichzelf. Met de detectiemethode werkt dezelfde controle voor numerieke, tekst- en datetime-kolommen. - 3VoorbeeldTel de ontbrekende weergegevens
Lima heeft temperatuur 18 en neerslag 0. Bij Oslo ontbreekt de temperatuur maar is de neerslag 4. Pune heeft temperatuur 31 en daar ontbreekt de neerslag. Bij Kyiv ontbreken beide metingen. Elke stadsnaam is bekend.
df.isna().sum()geeft stad 0, temperatuur 2 en neerslag 2.df.isna().mean()geeft aandelen ontbrekende waarden van 0, 0,5 en 0,5 omdat elke kolom vier waarden heeft. - 4KernpuntOnderscheid cellen van rijen
Kyiv heeft twee ontbrekende cellen, terwijl Oslo en Pune er elk één hebben. Er zijn vier ontbrekende cellen maar slechts drie getroffen rijen.
df.isna().sum().sum()telt de cellen.df.isna().any(axis=1).sum()markeert eerst of elke rij een ontbrekende waarde heeft en telt daarna die rijen. De rijgewijzeanyvoorkomt dat Kyiv twee keer wordt geteld. - 5UitdagingZoek een verborgen code voor ontbrekende waarden
Een sensorkolom bevat 0, 7, -999 en
NaN. In de documentatie staat dat -999 betekent dat de sensor uitstond. Hoeveel waarden moeten na het opschonen bekend blijven?---reveal---
Twee: 0 en 7. Vervang de gedocumenteerde code -999 door een markering voor ontbrekende waarden en gebruik daarna opnieuw
isna(). Nul is hier een echte meting. Als je elke nul als ontbrekend behandelt, verwijder je naast de niet-beschikbare metingen ook een bekende waarde. - 6VoorbeeldBehoud rijen met een temperatuur
Stel dat de analyse temperatuur nodig heeft maar onbekende neerslag kan verdragen. Gebruik
clean = df.dropna(subset=["temp_c"]). Dit behoudt Lima en Pune.De standaardaanroep
dropna()zou alleen Lima behouden omdat die elke kolom controleert.thresh=2zou ook Oslo behouden, waarvan de stad en neerslag bekend zijn. Kies de regel die uitdrukt welke kolommen de analyse werkelijk nodig heeft. - 7VoorbeeldMarkeer schattingen vóór het aanvullen
Begin voor een neerslaganalyse die alle steden behoudt met de oorspronkelijke vier rijen. Bewaar vóór het aanvullen van temperaturen
df["temp_missing"] = df["temp_c"].isna().De bekende temperaturen 18 en 31 hebben een gemiddelde van 24,5. Ken
df["temp_c"] = df["temp_c"].fillna(df["temp_c"].mean())toe om de twee ontbrekende waarden aan te vullen. De bewaarde indicator laat nog steeds zien dat de metingen voor Oslo en Kyiv zijn geschat. - 8TipKies de schatting op basis van de betekenis
Aanvullen met het gemiddelde gebruikt de bekende metingen als eenvoudige schatting, maar verkleint de zichtbare variatie. De mediaan is minder gevoelig voor extreme metingen. Aanvullen met nul stelt iets anders: de ontbrekende hoeveelheid was nul.
Een uitgeschakelde regensensor bewijst niet dat de neerslag nul was. Gebruik aanvullingen per kolom die passen bij de datatypes, zoals een dictionary met numerieke waarden voor numerieke velden en tekst voor tekstvelden.
- 9VerbandGebruik volgorde alleen als die informatie bevat
Voorwaarts opvullen neemt de vorige bekende waarde over op een plaats waar een waarde ontbreekt; achterwaarts opvullen gebruikt de volgende. Bij 12,
NaN,NaN, 15 geeftffill(limit=1)12, 12,NaN, 15.Interpolatie schat daarentegen tussen bekende posities: 10,
NaN,NaN, 16 wordt 10, 12, 14, 16. Deze methoden passen bij metingen met een betekenisvolle volgorde, niet bij een lijst van steden zonder onderling verband. - 10UitdagingBehoud bruikbare rijen zonder te stellen dat er geen regen viel
Drie records bevatten A/19/2, B/21/
NaNen C/NaN/5 voor stad/temperatuur/neerslag. Je hebt temperatuurvergelijkingen nodig en kunt ontbrekende neerslag niet schatten. Welke rijen en waarden moet je behouden?---reveal---
Behoud A en B door de temperatuurkolom te controleren met
dropna(subset=["temp_c"]). Laat de neerslag van B ontbreken. Als je op alle kolommen verwijdert, verlies je de bruikbare temperatuur van B; als je de neerslag met nul aanvult, voeg je een niet-onderbouwde meting toe. - 11VoorbeeldVergelijk volledige records
Een besteltabel heeft ID's 101, 102, 102, 103, 104, 104. De twee rijen voor 102 zijn identiek. De twee rijen voor 104 verschillen in geregistreerd gewicht: 0,5 kg en 0,8 kg.
df.duplicated().sum()meldt één extra kopie van een volledige rij.drop_duplicates()laat vijf rijen over omdat de verschillende records voor 104 geen exacte kopieën zijn. Indexlabels beïnvloeden deze vergelijking niet. - 12UitlegKies een sleutel en een versie om te behouden
Als je alleen
order_idvergelijkt, worden de tweede 102 en de tweede 104 als herhalingen gemarkeerd, wat twee extra kopieën van sleutels geeft. De vraag is nu welke versie elke bestelling vertegenwoordigt.keep="last"kiest de laatste in de huidige rijvolgorde. Om dat de nieuwste te laten betekenen, sorteer je eerst op een bijwerkveld.keep=Falseverwijdert alle leden van herhaalde groepen en zou dus beide records voor 104 verwijderen. - 13UitdagingBehoud het nieuwste record
Artikel H heeft bijwerkingen 1, 4, 2 en gewichten 3, 6, 5 kg in die invoervolgorde. Hoe behoud je het nieuwste record en welk gewicht blijft over?
---reveal---
Sorteer
updatedoplopend en gebruik daarnadrop_duplicates(subset="item", keep="last"). De laatste bijwerking is 4, dus 6 kg blijft over. Als je zonder sorteren de laatste invoerrij behoudt, selecteer je bijwerking 2 en behoud je ten onrechte 5 kg. - 14TipStandaardiseer voordat je identiteit controleert
De tekstsleutels “ Lisbon”, “lisbon” en “LISBON ” komen niet exact overeen. Verwijder witruimte aan de buitenkant en maak ze klein als die schrijfwijzen dezelfde stad aanduiden. Inspecteer daarna herhaalde sleutels.
Het doel van de tabel bepaalt of herhaling geldig is: veel bestellingen kunnen een klant delen, maar een opzoektabel die één gegevensrij per klant moet geven heeft unieke sleutels nodig. Geldige bestellingen verwijderen kan een herhaalde opzoeksleutel niet herstellen.
- 15UitdagingVerbind tekstopschoning met de keuze van records
Klantrecords hebben de sleutels “ emi ” en “EMI”, bijwerkingen 2 en 5 en saldi 10 en 14. In een derde record zonder verband ontbreekt het oudere saldo. Je hebt het nieuwste record per klant nodig. Wat moet er gebeuren voordat je saldi aanvult?
---reveal---
Standaardiseer de sleutels, sorteer op bijwerking en behoud de laatste rij per opgeschoonde sleutel. De twee schrijfwijzen van Emi worden één klant met saldo 14. Bepaal eerst de identiteit van records zodat verouderde versies geen invloed hebben op een latere statistiek voor het aanvullen.
- 16SamenvattingControleer het resultaat aan de hand van de keuze
Vergelijk na het opschonen het aantal rijen, de aantallen ontbrekende waarden en de uniciteit van sleutels met het beoogde resultaat. Een indicator voor ontbrekende waarden houdt schattingen zichtbaar; een gesorteerde controle op duplicaten op basis van sleutels houdt de gekozen recordversie zichtbaar.
Sla teruggegeven objecten op via directe toekenning. Onder het kopiëren bij schrijven van pandas 3 wijzigt een geketende
inplace-aanroep op een geselecteerde kolom het bovenliggende DataFrame niet.
2Transformeer codes en metingen
15 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieKies de betekenis van de uitvoer
- 2VoorbeeldVertaal of wijzig een waarde
- 3VoorbeeldConverteer de tekst nadat je de opmaak hebt opgeschoond
- 4KernpuntHoud kolomkoppen en cellen gescheiden
- 5UitdagingZoek de oorzaak van een nieuwe ontbrekende waarde
- 6VoorbeeldLees de grenzen van een interval
- 7UitlegNeem de laagste grens bewust op
- 8VerbandKies breedtes of aantallen
- 9UitdagingTest de grensregel
- 10VoorbeeldTrek het minimum af voordat je deelt
- 11VoorbeeldMeet de afstand tot het gemiddelde
- 12TipBegrens zonder een waarneming te verwijderen
- 13UitlegGeef aan tot welke categorie een waarde behoort
- 14UitdagingVerklaar een indicatorrij met alleen onwaar
- 15SamenvattingControleer de gemaakte weergave
3Zet inconsistente tekst om in bruikbare labels
17 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieGeef tekst een consistente structuur
- 2UitlegPas een methode toe op elke tekenreeks
- 3VoorbeeldSplits alleen waar het formaat dat vereist
- 4TipZoek gewone tekst letterlijk
- 5UitdagingBereid een tekstsleutel voor een samenvoeging voor
- 6UitlegMaak een patroon voor een hoeveelheid
- 7VoorbeeldHaal de eerste hoeveelheid op
- 8VerbandKies alle overeenkomsten als één niet genoeg is
- 9UitdagingWijs een gedeeltelijke overeenkomst van een code af
- 10TipBeperk hoeveel een patroon omvat
- 11VoorbeeldOnderscheid de labellijst van de codes
- 12UitlegGeef maten de bedoelde volgorde
- 13TipMaak ruimte voordat je een nieuw label toekent
- 14UitdagingHoud lege categorieën zichtbaar
- 15VerbandCombineer categorieën uit verschillende gegevensblokken
- 16UitdagingSchoon op voordat je de toegestane lijst definieert
- 17SamenvattingInspecteer zowel tekstwaarden als opslag
4Combineer tabellen en verklaar elke rij
18 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieKies hoe de tabellen samenhangen
- 2VoorbeeldBenoem de gemeenschappelijke sleutel expliciet
- 3UitlegBehoud de kant die je nodig hebt
- 4KernpuntVerwacht elk overeenkomend paar
- 5TipMaak van de relatie een gecontroleerde regel
- 6VoorbeeldTel sleutels zonder overeenkomst afzonderlijk
- 7UitdagingZoek de oorzaak van extra rijen
- 8VoorbeeldKoppel een linkerkolom aan een rechterindex
- 9TipOnderscheid overlappende kolommen
- 10VoorbeeldGeef de hoofdbron voorrang
- 11VerbandVolg labels bij het optellen van waarden
- 12UitdagingVul de juiste waarneming aan
- 13VoorbeeldVoeg waarnemingen toe door kolomnamen uit te lijnen
- 14UitlegBehoud een herkomstlabel of maak een nieuwe index
- 15KernpuntLijn rijen uit bij het toevoegen van kolommen
- 16UitdagingOnderzoek nieuwe ontbrekende afstanden
- 17UitdagingCombineer gegevensblokken voordat je opzoekgegevens toevoegt
- 18SamenvattingVerklaar toevoegingen en overeenkomsten
5Herstructureer waarden met behoud van hun labels
18 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieHoud de identiteit van elke meting bij
- 2VoorbeeldGeef een rij twee labels
- 3UitlegSelecteer het niveau dat je werkelijk bedoelt
- 4TipSorteer nadat je de rollen van niveaus hebt gewijzigd
- 5UitdagingSelecteer een binnenste niveau zonder de gegevens te wijzigen
- 6VoorbeeldVerplaats jaarkolommen naar de index
- 7UitlegKies het niveau dat kolommen wordt
- 8KernpuntHerken een nieuw zichtbare ontbrekende waarde
- 9UitdagingZoek waarom omzetting naar breed formaat mislukt
- 10VerbandKies lang of breed voor de volgende taak
- 11VoorbeeldZet een unieke combinatie met pivot om in een cel
- 12UitlegAggregeer alleen als dat de bedoeling is
- 13VoorbeeldZet metingen met melt om en behoud identificatiegegevens
- 14TipControleer welk type een kolomlabel wordt
- 15UitdagingReconstrueer een ontbrekende cel in breed formaat
- 16VerbandHerstel een tabel voor kolombewerkingen
- 17UitdagingKies de oplossing voor herhaalde metingen
- 18SamenvattingControleer vorm, uniciteit en betekenis
Gegevens bewerken met pandas: oefenvragen
Set 1: Lees de gegevens en voorspel eenvoudige veranderingen10 Oefenvragen
Vraag 1 van 10
NaN en 12. Wat is het standaard berekende gemiddelde?Toon antwoordVerberg antwoord
len telt posities; het standaardgemiddelde slaat ontbrekende waarden over.Vraag 2 van 10
df.isna().any(axis=1).sum()?Toon antwoordVerberg antwoord
Vraag 3 van 10
item, mass_kg en note. Rij U heeft een bekende massa en een ontbrekende notitie; rij V heeft een ontbrekende massa en een bekende notitie. Beide artikelnamen zijn bekend. Wat behoudt df.dropna(subset=["mass_kg"])?Toon antwoordVerberg antwoord
Vraag 4 van 10
s.map({"A": "active", "B": "blocked"}) op?Toon antwoordVerberg antwoord
replace met deze dictionary. Een dictionary die aan map wordt doorgegeven, definieert uitvoerwaarden voor de hele waardetoewijzing, niet alleen wijzigingen van geselecteerde waarden.Vraag 5 van 10
pd.cut(x, [0, 10, 20]). Waar komt 10 terecht?Toon antwoordVerberg antwoord
right=False nodig.Vraag 6 van 10
s.str.strip().str.lower()?Toon antwoordVerberg antwoord
Vraag 7 van 10
str.contains(r"\d+") en str.fullmatch(r"\d+") die code?Toon antwoordVerberg antwoord
Vraag 8 van 10
Toon antwoordVerberg antwoord
Vraag 9 van 10
id, km. Gegevensblok B met drie rijen heeft de kolommen id, km, flag. Welke vorm levert pd.concat([a, b], ignore_index=True) op?Toon antwoordVerberg antwoord
join="inner" nodig zijn; de index opnieuw instellen verwijdert geen extra kolom.Vraag 10 van 10
station, dry en wet. Hoeveel rijen ontstaan als je de twee meetkolommen met id_vars="station" omzet met melt?Toon antwoordVerberg antwoord
Set 2: Kies methoden voor veelvoorkomende gegevensbewerkingen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
drop_duplicates(subset="id", keep=False)?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
NaN; NaN; 11,0. Wat levert ffill(limit=1) op?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
pd.to_numeric(..., errors="coerce") is toegepast?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
s.replace("Rd", "Road")?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
NaN; Series b heeft q = 9, r = 2. Wat is a.combine_first(b)?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
.loc["C"] totalen per locatie voor maand 6 te krijgen. Welke correctie behoudt de metingen en geeft de benodigde totalen?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: Volg labels, sleutels en veranderende vormen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
"", " " en None, die rechtstreeks in het geheugen zijn gemaakt. Hoeveel waarden telt s.isna().sum()?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
qcut-groepen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
s.str.extract(r"(\d+)\s*kg", expand=False) gevolgd door numerieke conversie terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
["small", "large"] en daarna geteld met dropna=False. Welke aantallen verschijnen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
_merge-rijen voor both, left_only en right_only?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
x.add(y, fill_value=0) de som van de resulterende waarden?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
.loc[2027] na swaplevel("city", "year").sort_index()?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
pivot_table gebruikt met locaties als rijen, jaren als kolommen en de standaardaggregatie, en daarna de ene jaarkolom omzet met melt?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Onderzoek veranderingen in een opschoningsproces10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
NaN. Je bewaart een indicator voor ontbrekende waarden en vult daarna de ontbrekende waarde aan met de mediaan van de kolom. Welke waarde wordt ingevuld en hoeveel indicatorwaarden zijn waar?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
None, “ 9 ”. Hoeveel oorspronkelijk aanwezige waarden zijn na to_numeric(errors="coerce") ontbrekend geworden?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
cut met de grenzen [0, 10, 20] en standaardindicatoren zijn twee rijen volledig onwaar. Je wilt geldige massa's indelen en onbekende metingen afzonderlijk herkenbaar maken. Welke oplossing past?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
s.str.split("/", n=1, expand=True) met “zone/aisle/bin”?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
r"(\d+)" ophalen en converteren. Welke numerieke waarden blijven over?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
id, km. Tabel b heeft één rij met de kolommen id, Km. Hoeveel cellen ontbreken in de twee afstandskolommen samen na rijconcatenatie met de standaardverwerking van kolommen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
.loc[2026] en gebruikt daarna pivot. Welke correctie selecteert de gegevens en levert één rapportrij op?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
site, day en night. Eén nachtcel ontbreekt. Wat zijn het aantal lange rijen en het aantal ontbrekende cellen in de brede tabel nadat je beide metingen met melt omzet, ontbrekende waarden verwijdert en met pivot terugdraait?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 5: Redeneer door gekoppelde transformaties10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
NaN en 6. De documentatie definieert -99 als ontbrekend en 0 als een echte meting. Wat zijn na het opschonen het aantal bekende waarden en het gemiddelde?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
{"a": "4", "b": "bad"} en past daarna numerieke typeconversie met ontbrekende waarden bij fouten toe. Welke oorspronkelijke waarden ontbreken uiteindelijk en waarom?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
NaN; de reservewaarden zijn a = 50, b = 7, c = 9. Wat zou na primary.combine_first(backup) veranderen als je de voorrang van de bronnen omdraait?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
kg en count, beide met "Int64", dat ontbrekende waarden ondersteunt. Een derde heeft alleen kg met dat datatype. Wat verklaart de resulterende kolom count na rijconcatenatie het best?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
achtervoegsel
_sensor onderscheidt een meetkolom van een gelijknamige kolom in een reservetabel.achterwaarts opvullen
as
B
begrenzen
breed formaat
bronsleutel
concat wordt meegegeven, wordt een buitenste indexlabel dat het deel identificeert waaruit elke rij of kolom afkomstig is.C
categoriecode
categorisch datatype
combine_first
combine_first om ontbrekende metingen vanuit een reservebron aan te vullen en bekende waarden uit de hoofdbron te behouden.concatenatie
D
datatype met ondersteuning voor ontbrekende waarden
"Int64" voor gehele getallen met pd.NA.doorsnede
dropna
dropna(subset=["mass_kg"]) als bruikbare rijen een massa moeten hebben, ook als een ander veld onvolledig is.dubbele rij
G
geordende categorische variabele
gevectoriseerde bewerking
gretige herhaling
r"<.*>" kan beide tags en de tekst ertussen omvatten in een korte tekenreeks met opmaak.H
herkomstindicator bij samenvoeging
herstructureren
hoofdlettergebruik normaliseren
I
id_vars
id_vars="station" instelt, blijven stationsnamen buiten de numerieke metingen die door melt ontstaan.ignore_index
ignore_index=True in als maandbestanden rijnummers hebben die geen betekenis hebben en anders zouden worden herhaald.imputatie
indexniveau
loc-selectie met één label gebruikt.indicatorkolom
get_dummies is gemaakt, is alleen waar voor rijen met het label blue.inner join
interpolatie
NaN, 12 om in 8, 10, 12 als een rechtlijnige schatting past.K
klasse
(0, 10] is de meting 10 inbegrepen en de meting 0 uitgesloten.klasse-indeling op basis van kwantielen
qcut om lage, middelste en hoge groepen met vergelijkbare aantallen metingen te vergelijken.kopiëren bij schrijven
koppeling op de index
join gebruikt de rechterindex ook als een linkersleutelkolom is opgegeven.L
lang formaat
left join
letterlijke patroonvergelijking
M
map
map voor landcodes maakt codes die niet in de dictionary staan zichtbaar als ontbrekende waarden die de analist kan inspecteren.masker voor ontbrekende waarden
melt
melt van vier jaarkolommen maakt vier rijen per stad, inclusief rijen voor lege meetcellen.min-maxschaling
MultiIndex
N
NaN
isna() om NaN in de temperatuurkolom te vinden voordat je de metingen telt die beschikbaar zijn voor een gemiddelde.NaT
isna() herkent die naast ontbrekende numerieke metingen.O
ongebruikte categorie
ontbrekende combinatie
NaN wanneer de lange metingen met unstack worden omgezet.ontbrekende waarde
rain_mm betekent dat de meting niet beschikbaar is en moet dus worden onderscheiden van geen regen.outer join
P
pivot
pivot van station en maand vereist één meting voor elke cel van station/maand in de uitvoer.pivot_table
pivot_table met aggfunc="sum" als afzonderlijke zendingen moeten worden opgeteld tot een dagtotaal.R
recordsleutel
reguliere expressie
rename
rename(columns={"Weight": "mass_kg"}) om een kolomkop een duidelijke betekenis te geven zonder de cellen te wijzigen.replace
replace kan “pending” veranderen in “open” zonder de andere statuswaarden te wijzigen.reset_index
reset_index(level="year") om jaar als kolom te herstellen en stad in de index te laten staan.ruwe tekenreeks
r die backslashes behoudt voor toepassingen zoals patronen in reguliere expressies.r"\d+", zodat de backslash de reguliere-expressieverwerker bereikt.S
samenvoeging op sleutels
sortering op de index
stack
stack aanroept op een stadstabel met jaarkolommen, krijg je indexparen van stad/jaar voor dezelfde verkoopwaarden.str-accessor
s.str.lower() om een hele stadskolom in één expressie klein te maken.subset
subset="order_id" om herhaalde bestelsleutels op te sporen, ook als hun geregistreerde gewichten verschillen.T
tekenklasse
\d of een bereik zoals [A-Z] in een patroon.[A-Z] komt overeen met één hoofdletter in een voorraadcode vóór de cijfers.tekenreeksen splitsen
typeconversie
typeconversie met ontbrekende waarden bij fouten
to_numeric zet leesbare waarden om in getallen en maakt onleesbare waarden ontbrekend in plaats van een fout te geven.U
uitlijning op labels
uniciteit
unstack
unstack("year") om elk jaar in een afzonderlijke verkoopkolom voor elke stad te plaatsen.V
vastleggroep
veel-op-éénrelatie
vereniging van categorieën
volledige patroonovereenkomst
r"\d+" accepteert “204” en wijst “204x” af, ook al bevatten beide tekenreeksen cijfers.voorwaarts opvullen
W
witruimte
str.strip() worden opgeschoond.Z
z-score
Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.