28/01/2022
I en verden af dataanalyse er evnen til effektivt at filtrere og udvælge specifikke datasæt afgørende for at udlede meningsfuld indsigt. Python-biblioteket Pandas er et utroligt kraftfuldt værktøj til datamanipulation, men mange, især begyndere, støder på en uventet forhindring, når de forsøger at anvende logiske betingelser. Brugen af standard Python-operatorer som 'and' og 'or' fører ofte til fejl og forvirring. Denne artikel er din omfattende guide til at forstå og korrekt anvende logiske operatorer i Pandas, så du kan filtrere dine DataFrame-objekter med præcision og selvtillid.

Hvorfor standard Python-operatorer ('and', 'or') fejler i Pandas
Et almindeligt problem for nye Pandas-brugere er den frustrerende ValueError: The truth value of a Series is ambiguous. Denne fejl opstår, når man forsøger at bruge Pythons indbyggede logiske operatorer and eller or til at filtrere en DataFrame. Men hvorfor sker det?
Svaret ligger i, hvordan disse operatorer er designet. Pythons and og or er skabt til at arbejde med enkelte, sandhedsværdier (skalarer), såsom True eller False. De kan ikke håndtere en hel kolonne eller en Series af booleske værdier, som er det, en betingelse som df['kolonne'] > 5 returnerer. Når Pandas ser en hel serie af True/False-værdier, ved den ikke, hvordan den skal evaluere den til en enkelt sandhedsværdi. Skal den returnere True, hvis 'any' (enhver) værdi er sand, eller kun hvis 'all' (alle) værdier er sande? Denne tvetydighed er, hvad der udløser fejlen.
For at løse dette problem har Pandas implementeret sine egne versioner af logiske operatorer, der er designet til at arbejde element-for-element på tværs af serier. Disse er kendt som bitvise operatorer.

De Korrekte Værktøjer: Bitvise Operatorer (&, |, ~)
For at udføre logiske operationer korrekt i Pandas skal du bruge de bitvise operatorer. Selvom de oprindeligt stammer fra operationer på binære tal, har Pandas overtaget dem til at udføre elementvise logiske sammenligninger på booleske serier.
&for logisk AND: ReturnererTruefor en række, kun hvis begge betingelser er opfyldt for den pågældende række.|for logisk OR: ReturnererTruefor en række, hvis mindst én af betingelserne er opfyldt for den pågældende række.~for logisk NOT: Inverterer sandhedsværdien for hver række i en serie (Truebliver tilFalseog omvendt).
En anden afgørende detalje er brugen af parenteser () omkring hver enkelt betingelse. På grund af Pythons operatorpræcedens er det nødvendigt at indkapsle hver betingelse for at sikre, at de evalueres korrekt, før den bitvise operator anvendes. Uden parenteser vil koden sandsynligvis fejle eller give et uventet resultat.

Praktiske Eksempler: Filtrering i Aktion
Lad os se på, hvordan disse operatorer fungerer i praksis. Vi starter med at oprette en simpel DataFrame.
import pandas as pd data = { 'hold': ['A', 'A', 'B', 'B', 'B', 'C', 'C'], 'point': [25, 12, 15, 23, 19, 25, 29], 'assists': [5, 7, 7, 9, 12, 9, 4] } df = pd.DataFrame(data) Brug af Logisk AND (&)
Forestil dig, at vi vil finde alle rækker, hvor et hold har scoret mere end 20 point OG har præcis 9 assists. Vi kombinerer de to betingelser med & operatoren, og husker parenteserne.

# Filtrer rækker hvor point > 20 OG assists == 9 filtreret_df = df[(df['point'] > 20) & (df['assists'] == 9)] print(filtreret_df) Resultatet vil være en ny DataFrame, der kun indeholder de rækker, der opfylder begge krav:
hold point assists 3 B 23 9 5 C 25 9 Brug af Logisk OR (|)
Lad os nu sige, at vi er interesserede i rækker, hvor et hold enten har færre end 15 point ELLER mere end 10 assists. Her bruger vi | operatoren.
# Filtrer rækker hvor point < 15 ELLER assists > 10 filtreret_df_or = df[(df['point'] < 15) | (df['assists'] > 10)] print(filtreret_df_or) Dette vil returnere rækker, der opfylder mindst en af de to betingelser:
hold point assists 1 A 12 7 4 B 19 12 Brug af Logisk NOT (~)
NOT-operatoren er nyttig til at invertere en betingelse. Hvis vi for eksempel vil have alle rækker, undtagen dem der tilhører hold 'A', kan vi bruge ~.
# Filtrer alle rækker hvor hold IKKE er 'A' ikke_a_hold = df[~(df['hold'] == 'A')] print(ikke_a_hold) Resultatet er en DataFrame uden nogen rækker for hold 'A'.

hold point assists 2 B 15 7 3 B 23 9 4 B 19 12 5 C 25 9 6 C 29 4 Sammenligning af Metoder til Logisk Filtrering
Selvom bitvise operatorer er den mest almindelige metode, findes der alternativer. Her er en tabel, der sammenligner de forskellige tilgange til filtrering.
| Formål | Standard Metode | Alternativ Metode | Fordele ved Alternativ |
|---|---|---|---|
| Logisk AND | (df.col1 > x) & (df.col2 < y) | df.query('col1 > @x and col2 < @y') | Mere læsbar syntaks, ingen parenteser nødvendige. |
| Logisk OR | (df.col1 > x) | (df.col2 < y) | df.query('col1 > @x or col2 < @y') | Bruger de velkendte 'or' og 'and' strenge. |
| Flere Betingelser | (betingelse1) & (betingelse2) & (betingelse3) | np.logical_and.reduce([b1, b2, b3]) | Ideel til et dynamisk antal betingelser i en liste. |
Ofte Stillede Spørgsmål (FAQ)
Hvorfor får jeg en `ValueError`, når jeg bruger 'and' til at filtrere i Pandas?
Denne fejl opstår, fordi Pythons 'and' operator er designet til at sammenligne to enkelte sandhedsværdier (f.eks. `True and False`), ikke hele serier af booleske værdier, som Pandas-betingelser producerer. Du skal i stedet bruge den bitvise operator &, som udfører en elementvis sammenligning.

Skal jeg altid bruge parenteser omkring mine betingelser?
Ja, det er stærkt anbefalet og i de fleste tilfælde nødvendigt. Pythons regler for operatorpræcedens prioriterer bitvise operatorer som & højere end sammenligningsoperatorer som > eller ==. Uden parenteser vil Python forsøge at evaluere df['point'] > (20 & df['assists']) == 9, hvilket er meningsløst og vil resultere i en fejl. Parenteserne sikrer, at hver betingelse evalueres til en boolesk serie, før den bitvise operator anvendes.
Hvad er fordelen ved at bruge `df.query()`?
DataFrame.query()-metoden giver dig mulighed for at skrive dine betingelser som en streng. Dette kan gøre koden mere læsbar, især ved komplekse filtreringer, da du kan bruge 'and' og 'or' i strengen og undgå de mange parenteser og bitvise operatorer. Det kan også være lidt mere performant i visse situationer.
Let’s see how to Select rows based on some conditions in Pandas DataFrame. Selecting rows based on particular column value using '>', '=', '=', '<=', '!=' operator. Code #1 : Selecting all the rows from the given dataframe in which 'Percentage' is greater than 80 using basic method. Output :[/caption]
Hvornår er det bedst at bruge NumPy's logiske funktioner som `np.logical_and`?
NumPy's funktioner er særligt nyttige, når du har en liste af booleske serier, som du vil kombinere. For eksempel, hvis du dynamisk genererer flere filterbetingelser og gemmer dem i en liste, kan du bruge np.logical_and.reduce() til at anvende dem alle på én gang, hvilket er mere elegant end at kæde en lang række &-operatorer sammen.
Konklusion
At mestre logisk filtrering i Pandas er en fundamental færdighed for enhver dataanalytiker. Nøglen er at huske at udskifte Pythons standard and, or og not med Pandas' elementvise, bitvise operatorer: &, |, og ~. Lige så vigtigt er det at indkapsle hver enkelt betingelse i parenteser for at undgå fejl relateret til operatorpræcedens. Ved at følge disse simple regler og udforske alternativer som .query(), kan du transformere din datafiltrering fra en kilde til frustration til et hurtigt og effektivt værktøj i din analyseværktøjskasse.
Hvis du vil læse andre artikler, der ligner Pandas-operatorer: Din Guide til Datafiltrering, kan du besøge kategorien Sundhed.
