str.contains(), str.startswith(), str.endswith() în pandas

Text (.str) pandas 1.0+

Verifică dacă fiecare text conține, începe sau se termină cu un anumit șir; rezultatul True/False se folosește la filtrare.

Sintaxă
serie.str.contains(pat, case=True, flags=0, na=..., regex=True)  serie.str.startswith(pat)  serie.str.endswith(pat)

Ce face str.contains(), str.startswith(), str.endswith()

str.contains() returnează pentru fiecare valoare True dacă textul conține șirul căutat și False altfel. Rezultatul se pune direct între parantezele drepte pentru a păstra doar rândurile potrivite: df[df["produs"].str.contains("lapte")].

Căutarea ține cont implicit de litere mari și mici; cu case=False nu mai ține. Atenție: regex este implicit True, deci caracterele speciale (., +, () au sens de expresie regulată. Pentru căutarea unui text exact pune regex=False.

str.startswith() și str.endswith() verifică începutul și sfârșitul textului și acceptă și un tuplu de variante. La coloanele de tip str (implicit în pandas 3), valorile lipsă dau False; la coloanele de tip object ele dau valoare lipsă, iar parametrul na alege ce se pune în locul lor.

Parametri

Parametru Descriere
pat Textul (sau expresia regulată) căutat. La startswith/endswith poate fi un tuplu de texte.
case True (implicit): literele mari și mici contează. False: nu contează.
flags Opțiuni din modulul re, de exemplu re.IGNORECASE.
na Valoarea pusă în rezultat pentru valorile lipsă (de obicei False).
regex True (implicit): pat este expresie regulată. False: text simplu.

Ce returnează

O Series de valori True/False, bună pentru filtrare.

Exemple

Exemplul 1: Filtrarea produselor după un cuvânt

Cu case=False se găsesc și „Lapte”, și „lapte”.

import pandas as pd

df = pd.DataFrame({"produs": ["Lapte 1.5%", "Pâine albă", "lapte bătut", "Iaurt"],
                   "pret": [7.5, 4.0, 6.2, 3.8]})
print(df["produs"].str.contains("lapte"))
print(df[df["produs"].str.contains("lapte", case=False)])

Rezultat

0    False
1    False
2     True
3    False
Name: produs, dtype: bool
        produs  pret
0   Lapte 1.5%   7.5
2  lapte bătut   6.2

Exemplul 2: Text cu caractere speciale: regex=False

Ca expresie regulată, punctul din „1.5” înseamnă „orice caracter”, așa că se potrivește și „105”. Cu regex=False se caută exact textul „1.5”.

import pandas as pd

coduri = pd.Series(["Lapte 1.5%", "Cod 105", "Lapte 3.5%"])
print(coduri.str.contains("1.5").tolist())
print(coduri.str.contains("1.5", regex=False).tolist())

Rezultat

[True, True, False]
[True, False, False]

Exemplul 3: Început, sfârșit și valori lipsă

Coloana de tip object are o valoare lipsă; na=False o transformă în False, ca filtrul să funcționeze.

import pandas as pd

emailuri = pd.Series(["ana@gmail.com", "mihai@firma.ro", None, "elena@yahoo.ro"], dtype=object)
print(emailuri.str.endswith(".ro").tolist())
print(emailuri.str.endswith(".ro", na=False).tolist())
print(emailuri.str.startswith(("ana", "elena"), na=False).tolist())

Rezultat

[False, True, None, True]
[False, True, False, True]
[True, False, False, True]

Greșeli frecvente

  • Cauți un text cu punct, plus sau paranteze fără regex=False și primești potriviri în plus sau o eroare de expresie regulată.
  • Filtrezi cu un rezultat care are valori lipsă (coloană object): df[masca] dă eroare. Adaugă na=False.
  • Uiți că contains ține cont de litere mari și mici: „Lapte” nu se potrivește cu „lapte” fără case=False.

Comenzi înrudite