DataFrame.query() în pandas

Filtrează rândurile cu o condiție scrisă ca text, de exemplu "nota > 8 and oras == 'Iași'", cu variabile prin @.

Sintaxă
df.query(expr, *, parser='pandas', engine=None, local_dict=None, global_dict=None, resolvers=None, level=0)

Ce face DataFrame.query()

query() primește condiția ca șir de caractere, în care folosești direct numele coloanelor: df.query("nota > 8") face același lucru ca df[df["nota"] > 8]. În text poți scrie and, or, not, comparații înlănțuite (7 <= nota <= 9) și in / not in cu liste.

O variabilă Python din program se folosește cu @ în față: df.query("nota >= @prag"). Un nume de coloană cu spații sau cu caractere speciale se pune între backticks: df.query("`nota finala` > 8"). Textele din condiție stau în ghilimele de alt tip decât cele ale șirului.

Parametri

Parametru Descriere
expr Condiția, ca text. Numele coloanelor se scriu direct, variabilele cu @.
engine "numexpr" (dacă pachetul e instalat) sau "python". Implicit alege singur.
local_dict, global_dict Dicționare cu variabile în locul celor din program. Rar folosite.

Ce returnează

Un DataFrame nou, cu rândurile care respectă condiția.

Exemple

Exemplul 1: Condiții simple și compuse

import pandas as pd

df = pd.DataFrame({
    "nume": ["Ana", "Mihai", "Ioana", "Andrei", "Elena"],
    "oras": ["Iași", "Cluj", "Iași", "Cluj", "Brașov"],
    "nota": [9.5, 7.0, 8.5, 9.0, 6.0],
})

print(df.query("nota > 8 and oras == 'Iași'"))
print()
print(df.query("7 <= nota <= 9"))
print()
print(df.query("oras not in ['Iași', 'Cluj']"))

Rezultat

    nume  oras  nota
0    Ana  Iași   9.5
2  Ioana  Iași   8.5

     nume  oras  nota
1   Mihai  Cluj   7.0
2   Ioana  Iași   8.5
3  Andrei  Cluj   9.0

    nume    oras  nota
4  Elena  Brașov   6.0

Exemplul 2: Variabile cu @ și coloane cu spații

prag și orase sunt variabile din program; coloana „nota finala” are un spațiu, deci stă între backticks.

import pandas as pd

df = pd.DataFrame({
    "nume": ["Ana", "Mihai", "Ioana", "Andrei"],
    "oras": ["Iași", "Cluj", "Iași", "Brașov"],
    "nota finala": [9.5, 7.0, 8.5, 9.0],
})

prag = 8.5
orase = ["Iași", "Brașov"]
print(df.query("`nota finala` >= @prag and oras in @orase"))

Rezultat

     nume    oras  nota finala
0     Ana    Iași          9.5
2   Ioana    Iași          8.5
3  Andrei  Brașov          9.0

Greșeli frecvente

  • Scrii variabila fără @: df.query("nota > prag") caută o coloană numită prag și aruncă eroare dacă nu există.
  • Folosești aceleași ghilimele în interior și în exterior: "oras == "Iași"" închide șirul mai devreme. Pune textul în apostrofuri: "oras == 'Iași'".
  • Scrii o coloană cu spații fără backticks: df.query("nota finala > 8") dă eroare de sintaxă.
  • Folosești inplace=True: în pandas 3.1 parametrul este depreciat. Atribuie rezultatul: df = df.query(...).

Comenzi înrudite

  • Filtrare cu condiții (boolean indexing): Păstrează doar rândurile care îndeplinesc o condiție, cu operatorii &, |, ~ pentru condiții compuse și Series.between pentru intervale.
  • Series.isin() și DataFrame.isin(): Verifică pentru fiecare valoare dacă se află într-o listă dată; util pentru a filtra rândurile după mai multe valori permise.
  • DataFrame.loc: Selectează rânduri și coloane după etichete (numele din index și numele coloanelor) și permite modificarea valorilor.