Cursus
PySpark is bijzonder handig bij grote datasets, omdat het efficiënte methoden biedt om onze dataset op te schonen. In dit artikel focussen we op een veelvoorkomende schoonmaaktaak: hoe je kolommen verwijdert uit een DataFrame met de PySpark-methoden .drop() en .select().
Wil je meer leren over PySpark? Bekijk dan deze cursus Introduction to PySpark.
Waarom kolommen verwijderen in PySpark DataFrames?
Kolommen verwijderen is een veelvoorkomende stap in datapreprocessing om verschillende redenen. Het weghalen van onnodige of irrelevante kolommen kan de hoeveelheid data die we moeten verwerken flink verminderen. Dit stroomlijnt onze dataset, maakt analyse eenvoudiger en kan de prestaties van onze PySpark-jobs verbeteren.
Daarnaast houdt data voorbereiden voor machine learning vaak in dat je kolommen weglaat die niet bijdragen aan de nauwkeurigheid van het model of juist ruis introduceren. Deze stap kan leiden tot efficiëntere en effectievere modellen.
Tot slot kan het verwijderen van kolommen een strategie zijn om de datakwaliteit te verbeteren. Als een kolom een hoog percentage missende waarden of foutieve data bevat, kan verwijderen de beste keuze zijn.
Hoe verwijder je één kolom uit een PySpark DataFrame
Stel, we hebben een DataFrame df met vijf kolommen: player_name, player_position, team, minutes_played en score. De kolom minutes_played heeft veel missende waarden, dus we willen die verwijderen.
In PySpark kunnen we één kolom uit een DataFrame verwijderen met de methode .drop().
De syntax is df.drop("column_name") waarbij:
dfhet DataFrame is waaruit we de kolom willen verwijderencolumn_namede te verwijderen kolomnaam is.
De methode df.drop() retourneert een nieuw DataFrame waarin de opgegeven kolommen zijn verwijderd.
Zo kun je een kolom verwijderen:
df_dropped = df.drop("minutes_played")
Hoe verwijder je meerdere kolommen uit een PySpark DataFrame
Stel dat we ons DataFrame df willen analyseren, maar het team en de positie van de speler niet mee willen nemen—dus we willen beide kolommen verwijderen. Er zijn meerdere manieren om dit te doen, laten we de opties bekijken.
Om meerdere kolommen uit een PySpark DataFrame te verwijderen, kunnen we een lijst met kolomnamen doorgeven aan de methode .drop(). Dat kan op twee manieren:
# Optie 1: Namen als lijst doorgeven
df_dropped = df.drop(["team", "player_position"])
# Optie 2: Namen als losse argumenten doorgeven
df_dropped = df.drop("team", "player_position")
Als alternatief kunnen we meerdere .drop()-aanroepen achter elkaar koppelen. Hoewel dit technisch werkt, wordt het over het algemeen niet gezien als de meest efficiënte of elegante aanpak. Elke aanroep creëert een nieuw DataFrame, wat extra overhead kan geven, zeker bij grotere datasets.
df_dropped = df.drop("team").drop("player_position")
Kolommen conditioneel verwijderen
In plaats van op te geven welke kolommen we willen verwijderen, kunnen we de methode omdraaien en alleen die kolommen selecteren die aan een voorwaarde voldoen. Zo bevat het geretourneerde DataFrame de ongewenste kolommen niet meer.
Met .select()
We kunnen in PySpark de methode .select() gebruiken in combinatie met een list comprehension om één of meerdere kolommen te verwijderen op basis van bepaalde criteria. De methode is flexibel en kan worden gebruikt voor zowel eenvoudige als complexe voorwaarden.
Deze methode volgt de syntax df.select([col for col in df.columns if condition]), waarbij:
dfhet DataFrame is waar je mee werkt.conditionhet criterium is waarmee je de kolommen filtert die je wilt behouden.
Laten we weer met ons DataFrame df werken en alle kolommen selecteren behalve de kolom team:
df_sel = df.select([col for col in df.columns if col != "team"])
Complexe voorwaarden met .selectExpr()
Als we bekend zijn met SQL en complexere voorwaarden willen toepassen bij het filteren van kolommen, biedt PySpark's .selectExpr()-methode een krachtige oplossing. Hiermee kunnen we SQL-achtige expressies gebruiken om kolommen rechtstreeks in onze PySpark-code te selecteren en te bewerken.
Neem bijvoorbeeld dit voorbeeld:
# Selecteer specifieke kolommen en maak een nieuwe kolom 'FullMatch'
df_sel = df.selectExpr("player_name", "player_position", "minutes_played >= 60 as FullMatch")
Hier sluiten we niet alleen een kolom uit. We:
- Selecteren de kolommen
player_nameenplayer_position. - Maken een nieuwe kolom
FullMatchdie aangeeft of een speler een volledige wedstrijd heeft gespeeld (60 minuten of meer).
Deze flexibiliteit maakt .selectExpr() van onschatbare waarde in situaties waarin eenvoudige list comprehensions niet volstaan.
Best practices
Als we besluiten kolommen uit ons DataFrame te verwijderen, is het cruciaal om enkele best practices te volgen om dataintegriteit, leesbaarheid van de code en efficiëntie te behouden.
1. Maak een back-up van je data: Voordat je wijzigingen aanbrengt in je DataFrame, zeker bij het verwijderen van kolommen, is het verstandig een back-upkopie te maken. Zo kun je indien nodig terug naar de oorspronkelijke data.
df_backup = df.persist() # Cache het DataFrame om herberekenen later te vermijden
2. Verwijder met inplace=False (standaard): Standaard retourneert de methode .drop() een nieuw DataFrame zonder het origineel te wijzigen. Dat is over het algemeen veiliger. Als je er absoluut zeker van bent dat je het originele DataFrame wilt wijzigen, kun je inplace=True gebruiken, maar wees voorzichtig.
df_dropped = df.drop("column_to_drop", inplace=False) # Standaardgedrag
3. Documenteer je keuzes: Werk je aan een gezamenlijk project of verwacht je je code later te herzien, voeg dan opmerkingen toe waarin je uitlegt waarom je bepaalde kolommen hebt verwijderd. Deze documentatie biedt waardevolle context voor jezelf en anderen.
4. Overweeg kolommen te hernoemen: In plaats van kolommen te verwijderen, is het de moeite waard om na te gaan of hernoemen geschikter is, zeker als de informatie mogelijk waardevol is voor toekomstige analyses. PySpark biedt de methode .withColumnRenamed() om kolommen te hernoemen.
Conclusie
In deze tutorial hebben we geleerd hoe je één of meerdere kolommen verwijdert met de methoden .drop() en .select(). We hebben ook alternatieve methoden beschreven om SQL-expressies te gebruiken als we complexere selectietechnieken nodig hebben.
Wil je je skills uitbreiden en de krachtige technieken van PySpark benutten? Bekijk dan deze cursussen en materialen:
FAQs
Hoe verwijder ik kolommen op basis van regex in PySpark?
Om kolommen op basis van een regex-patroon in PySpark te verwijderen, kun je de kolomnamen filteren met een list comprehension en de re-module (voor reguliere expressies), en vervolgens de gefilterde lijst doorgeven aan de methode .drop().
Hoe verwijder ik kolommen met dezelfde naam in PySpark?
PySpark staat geen dubbele kolomnamen binnen een DataFrame toe. Als je databron dubbele namen heeft, krijg je waarschijnlijk een fout bij het maken van het DataFrame. De beste aanpak is om de dubbele namen op te lossen bij de bron of tijdens het aanmaken van het DataFrame.
Hoe verwijder ik kolommen met alleen null-waarden in PySpark?
Om kolommen te verwijderen die alleen null-waarden bevatten in PySpark, kunnen we eerst het aantal nulls per kolom berekenen met count(when(col(c).isNull(), c)). Daarna identificeren we de kolommen waarvoor het aantal nulls gelijk is aan het totale aantal rijen in het DataFrame. Tot slot verwijderen we deze kolommen met de methode .drop().
Hoe verwijder ik kolommen conditioneel in PySpark?
Gebruik df.select([col for col in df.columns if condition]).

