Categorisch gegevenstype
Converteer stringkolommen met weinig unieke waarden naar pandas Categorical om het geheugengebruik te verminderen en groupby-bewerkingen te versnellen.
Categorisch gegevenstype is een gratis Pandas & NumPy Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Pandas & NumPy Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.
Wat is het dtype Categorical?
Het dtype Categorical in Pandas is ontworpen voor kolommen met een beperkte verzameling afzonderlijke waarden (lage kardinaliteit), zoals geslacht, status, regio of productcategorie. In plaats van de volledige tekenreeks voor elke rij op te slaan, slaat Pandas de unieke waarden (de zogenaamde categorieën) één keer op en gebruikt het per rij een integercode om ernaar te verwijzen. Dit lijkt op de manier waarop databases opzoektabellen of enumtypen gebruiken.
import pandas as pd
df = pd.DataFrame({
'region': ['North', 'South', 'East', 'North', 'East', 'South'] * 1000
})
# Without Categorical: object dtype stores every string
print('object dtype memory:', df['region'].memory_usage(deep=True))
# With Categorical: only stores 3 unique values + integer codes
df['region_cat'] = df['region'].astype('category')
print('category dtype memory:', df['region_cat'].memory_usage(deep=True))Een Categorical Series maken
Converteer een kolom naar Categorical door .astype('category') aan te roepen op een Series. De resulterende Categorical Series slaat de unieke waarden op als .cat.categories en de integercodes voor posities als .cat.codes. Je kunt ook rechtstreeks een Categorical maken met pd.Categorical() om de categorieën en hun volgorde vooraf op te geven.
import pandas as pd
s = pd.Series(['low', 'high', 'med', 'high', 'low'])
s_cat = s.astype('category')
print(s_cat.cat.categories) # Index(['high', 'low', 'med'], dtype='object')
print(s_cat.cat.codes) # integer codes per row
# 0 1
# 1 0
# 2 2
# 3 0
# 4 1Geheugen besparen met Categorical
De geheugenbesparing van het dtype Categorical hangt af van de verhouding van de kardinaliteit (unieke waarden ÷ totaal aantal rijen). Bij 5 unieke tekenreeksen in een kolom met 1.000.000 rijen slaat het dtype object 1 miljoen verwijzingen naar tekenreeksen op (~50+ bytes elk), terwijl Categorical slechts 5 tekenreeksen plus 1 miljoen 8-bits integers opslaat. De besparing kan 5 tot 20 keer zijn, waardoor een kolom van 50 MB teruggebracht wordt naar 2-5 MB.
import pandas as pd
import numpy as np
n = 1_000_000
statuses = np.random.choice(['active', 'inactive', 'pending'], size=n)
df = pd.DataFrame({'status': statuses})
object_mem = df['status'].memory_usage(deep=True) / 1e6
df['status'] = df['status'].astype('category')
cat_mem = df['status'].memory_usage(deep=True) / 1e6
print(f'Object dtype: {object_mem:.1f} MB')
print(f'Category dtype: {cat_mem:.1f} MB')
print(f'Reduction: {object_mem/cat_mem:.1f}x')Geordende Categorical voor rangschikking
Sommige categorieën hebben een natuurlijke volgorde — bijvoorbeeld 'low' < 'medium' < 'high', of T-shirtmaten XS < S < M < L < XL. Een geordende Categorical legt deze rangschikking vast, waardoor zinvolle vergelijkingsoperatoren (<, >= enzovoort) mogelijk worden en resultaten van groupby in de juiste semantische volgorde worden gesorteerd in plaats van alfabetisch.
import pandas as pd
df = pd.DataFrame({
'priority': ['high', 'low', 'medium', 'high', 'low']
})
priority_type = pd.CategoricalDtype(
categories=['low', 'medium', 'high'],
ordered=True
)
df['priority'] = df['priority'].astype(priority_type)
# Comparison now works correctly
print(df['priority'] >= 'medium')
# 0 True
# 1 False
# 2 True
# 3 True
# 4 FalseGeordende Categoricals sorteren
Wanneer je een geordende Categorical-kolom sorteert, gebruikt Pandas de gedefinieerde categorievolgorde in plaats van de alfabetische volgorde. Dat betekent dat 'low' vóór 'medium' komt en 'medium' vóór 'high', ongeacht hoe deze waarden als tekenreeksen zouden worden gesorteerd. Dit is essentieel voor het maken van correct geordende overzichtstabellen en diagrammen.
import pandas as pd
df = pd.DataFrame({
'severity': pd.Categorical(
['high', 'low', 'medium', 'low', 'high'],
categories=['low', 'medium', 'high'],
ordered=True
),
'count': [5, 20, 8, 15, 3]
})
# sort_values respects the categorical order
print(df.sort_values('severity')[['severity', 'count']])
# severity count
# 1 low 20
# 3 low 15
# 2 medium 8
# 0 high 5
# 4 high 3Snelheid van GroupBy met Categorical
Pandas kan groupby()-bewerkingen op Categorical-kolommen optimaliseren, omdat alle mogelijke groepen vooraf bekend zijn. Hierdoor kan groupby op grote DataFrames 2 tot 5 keer sneller worden. Daarnaast retourneert groupby op Categorical alle categorieën — ook lege — zodat je overzichtstabellen altijd een rij bevatten voor elke verwachte groep, zelfs als sommige groepen nul waarnemingen hebben.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({
'region': pd.Categorical(
np.random.choice(['North', 'South', 'East', 'West'], 10),
categories=['North', 'South', 'East', 'West']
),
'sales': np.random.randint(100, 1000, 10)
})
# observed=False shows ALL categories even empty ones
print(df.groupby('region', observed=False)['sales'].sum())Categorieën toevoegen en verwijderen
Gebruik de accessor .cat om de categorielijst te beheren. .cat.add_categories() voegt nieuwe toegestane waarden toe (handig voordat je nieuwe gegevens invoegt), en .cat.remove_unused_categories() verwijdert categorielabels waarvoor geen bijbehorende rijen bestaan — handig na het filteren. Je kunt geen waarde toewijzen die niet in de categorieën staat zonder die eerst toe te voegen.
import pandas as pd
s = pd.Categorical(['a', 'b', 'a'], categories=['a', 'b', 'c'])
s = pd.Series(s)
print(s.cat.categories) # Index(['a', 'b', 'c'], dtype='object')
print(s.value_counts()) # a:2, b:1, c:0
# Remove unused category 'c'
s = s.cat.remove_unused_categories()
print(s.cat.categories) # Index(['a', 'b'], dtype='object')Categorielabels hernoemen
Met .cat.rename_categories() kun je categorieën een andere naam geven zonder de onderliggende codes te wijzigen. Dit is handig wanneer je gebruiksvriendelijkere namen wilt weergeven (bijvoorbeeld 'M' → 'Male') of inconsistente schrijfwijzen van hoofdletters in labels wilt corrigeren zonder terug te converteren naar object en opnieuw te mappen. De methode accepteert een lijst (positioneel) of een woordenboek (gericht).
import pandas as pd
s = pd.Series(pd.Categorical(['M', 'F', 'M', 'F'], categories=['M', 'F']))
# Rename using a dict
s = s.cat.rename_categories({'M': 'Male', 'F': 'Female'})
print(s)
# 0 Male
# 1 Female
# 2 Male
# 3 Female
print(s.cat.categories) # Index(['Male', 'Female'], dtype='object')Wanneer je Categorical NIET gebruikt
Het dtype Categorical is een slechte keuze bij een hoge kardinaliteit — als bijna elke rij een unieke waarde heeft (zoals gebruikers-ID's, vrije tekst of UUID's), is de categorie-index bijna net zo groot als de oorspronkelijke gegevens en levert die geen geheugenbesparing op. Een vuistregel: gebruik Categorical alleen wanneer het aantal unieke waarden ruwweg minder is dan 50% van het totale aantal rijen, en vooral wanneer het aantal unieke waarden in de tientallen of honderden ligt.
import pandas as pd
import numpy as np
df = pd.DataFrame({'user_id': range(1_000_000)})
# High-cardinality: every value is unique — don't use Categorical
object_mem = df['user_id'].astype(str).memory_usage(deep=True) / 1e6
cat_mem = df['user_id'].astype(str).astype('category').memory_usage(deep=True) / 1e6
print(f'String: {object_mem:.1f} MB')
print(f'Category: {cat_mem:.1f} MB')
# Category is WORSE for high-cardinality data!Categorical in draaitabellen en Groupby
Met Categorical zorg je voor een consistente uitvoervorm in resultaten van groupby en draaitabellen. Zonder Categorical worden groepen die toevallig nul waarnemingen hebben stilzwijgend weggelaten uit het resultaat — dit kan verkeerd uitgelijnde uitvoer veroorzaken wanneer je verschillende gegevenssegmenten vergelijkt. Met Categorical en observed=False verschijnen alle groepen altijd in de uitvoer.
import pandas as pd
df = pd.DataFrame({
'quarter': pd.Categorical(
['Q1', 'Q1', 'Q3'],
categories=['Q1', 'Q2', 'Q3', 'Q4']
),
'revenue': [100, 200, 300]
})
# observed=False includes Q2 and Q4 even though they have no rows
result = df.groupby('quarter', observed=False)['revenue'].sum()
print(result)
# quarter
# Q1 300
# Q2 0
# Q3 300
# Q4 0Categorical en machine learning
Veel scikit-learn-estimators verwachten numerieke invoer. Gebruik .cat.codes (labelcodering) of pd.get_dummies() (one-hotcodering) om een Categorical-kolom voor een model naar getallen te converteren. One-hotcodering voorkomt dat er een ordinale relatie tussen categorieën wordt gesuggereerd. Voor geordende categorische gegevens, zoals prioriteitsniveaus, is labelcodering (de codes rechtstreeks) geschikt en blijft de volgorde behouden.
import pandas as pd
df = pd.DataFrame({
'colour': pd.Categorical(['red', 'blue', 'green', 'red'])
})
# One-hot encode for unordered categories
one_hot = pd.get_dummies(df['colour'], prefix='colour')
print(one_hot)
# colour_blue colour_green colour_red
# 0 0 0 1
# 1 1 0 0
# 2 0 1 0
# 3 0 0 1Korte controle
Test je begrip van het dtype Categorical.
Samenvatting van de les
In deze les heb je geleerd dat het dtype Categorical unieke waarden één keer opslaat en per rij gehele codes gebruikt, waardoor je veel geheugen bespaart bij kolommen met weinig unieke waarden; dat een geordende Categorical betekenisvolle vergelijkingen en correct sorteren ondersteunt; en dat groupby met observed=False alle categorieën bevat, ook lege. Vermijd Categorical voor kolommen met veel unieke waarden. Hierna leer je datumtekenreeksen correct te parseren met pd.to_datetime().
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “Categorisch gegevenstype” gratis?
Ja — de volledige tekst van “Categorisch gegevenstype” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Pandas & NumPy Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.
Wat leer ik in “Categorisch gegevenstype”?
Converteer stringkolommen met weinig unieke waarden naar pandas Categorical om het geheugengebruik te verminderen en groupby-bewerkingen te versnellen. Je oefent met Pandas & NumPy Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Pandas & NumPy Academy te beginnen?
Ervaring vooraf is niet nodig. Pandas & NumPy Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Categorisch gegevenstype”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Pandas & NumPy Academy?
Ja. Elke les over Pandas & NumPy Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Gegevenstypen van kolommen inspecteren
- Converteren met astype()
- Categorisch gegevenstype
- Datums correct parseren