Pandas & NumPy Academy · Oppitunti

query()-metodi

Kirjoittakaa luettavia suodatuslausekkeita merkkijonoina query()-metodilla, käyttäkää Python-muuttujia kyselyissä @-merkillä ja ketjuttakaa suodattimia.

Oppitunti 2/413 vaihetta

query()-metodi on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Pandas & NumPy Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Miksi käyttää query()-menetelmää?

Pandasin totuusarvoindeksointi on tehokasta, mutta siitä voi tulla monisanaista, kun ehtoja yhdistetään paljon. query()-metodilla suodatuslausekkeet voi kirjoittaa tavallisina merkkijonoina, mikä on monien mielestä selkeämpää – etenkin SQL-taustasta tuleville. Sen sijaan että kirjoittaisitte df[(df['age'] > 30) & (df['salary'] > 50000)], voitte kirjoittaa df.query('age > 30 and salary > 50000').

Kyselymerkkijono arvioidaan DataFramen sarakenimien perusteella, joten sarakenimet toimivat merkkijonon sisällä muuttujien niminä.

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Carol', 'Dave'],
    'age': [25, 35, 28, 45],
    'salary': [50000, 90000, 70000, 120000]
})

# Boolean indexing style
result1 = df[(df['age'] > 27) & (df['salary'] > 60000)]

# Equivalent query() style
result2 = df.query('age > 27 and salary > 60000')

print(result2)
#     name  age  salary
# 1    Bob   35   90000
# 2  Carol   28   70000

Kyselymerkkijonon syntaksisäännöt

Kyselymerkkijonon sisällä voitte käyttää Pythonin tavallisia vertailuoperaattoreita (>, <, ==, !=, >=, <=) sekä loogisia yhdistimiä and, or ja not. Toisin kuin tavallisessa totuusarvoindeksoinnissa, tässä voitte käyttää englanninkielisiä sanoja – et- ja putkimerkkejä ei tarvita.

Sarakenimet, joissa on välilyöntejä tai jotka ovat ristiriidassa Pythonin avainsanojen kanssa, on ympäröitävä takahipsuilla: df.query('`first name` == "Alice"').

import pandas as pd

df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D'],
    'price': [10, 200, 50, 300],
    'in_stock': [True, False, True, True]
})

# Use 'and', 'or', 'not' in query strings
result = df.query('price > 40 and in_stock == True')
print(result)
#   product  price  in_stock
# 2       C     50      True
# 3       D    300      True

Python-muuttujien viittaaminen @-merkillä

query()-metodin tärkeä ominaisuus on mahdollisuus viitata ympäröivän näkyvyysalueen Python-muuttujiin etuliitteellä @. Tämä helpottaa parametrisoitujen suodattimien tekemistä: laskekaa raja-arvo, tallentakaa se muuttujaan ja käyttäkää kyselymerkkijonon sisällä @variable_name-viittausta arvon kirjoittamisen sijaan.

Tämä toimintamalli on erittäin hyödyllinen funktioissa, jotka vastaanottavat suodatusargumentteja ajonaikaisesti.

import pandas as pd

df = pd.DataFrame({
    'city': ['NYC', 'LA', 'Chicago', 'Houston'],
    'population': [8336817, 3979576, 2693976, 2320268]
})

min_pop = 3_000_000  # Python variable

# Use @ to inject the variable into the query
result = df.query('population > @min_pop')
print(result)
#    city  population
# 0   NYC     8336817
# 1    LA     3979576

query()-kutsujen ketjuttaminen

Koska query() palauttaa uuden DataFramen, voitte ketjuttaa useita query-kutsuja tai yhdistää ne muihin Pandas-metodeihin käsittelyketjussa. Ketjutuksessa jokainen suodatusvaihe pysyy omalla rivillään, mikä tekee logiikasta helppolukuista, helposti jäljitettävää ja muokattavaa.

Voitte myös ketjuttaa query()-metodin esimerkiksi .groupby()-, .sort_values()- tai .head()-metodien kanssa tiiviiden analyysikäsittelyketjujen rakentamiseksi.

import pandas as pd

df = pd.DataFrame({
    'region': ['North', 'South', 'North', 'East', 'South'],
    'year': [2022, 2022, 2023, 2023, 2023],
    'revenue': [100, 200, 150, 80, 300]
})

# Chain two query calls
result = (df
    .query('year == 2023')
    .query('revenue > 100')
    .sort_values('revenue', ascending=False)
)
print(result)
#    region  year  revenue
# 4   South  2023      300
# 2   North  2023      150

query()-metodin ja totuusarvoindeksoinnin vertailu

Molemmat menetelmät tuottavat saman tuloksen, mutta niillä on omat käyttökohteensa. query() sopii erinomaisesti usean ehdon suodattimiin, jotka vaatisivat totuusarvoindeksoinnissa paljon sulkeita. Totuusarvoindeksointi on parempi, kun ehto sisältää monimutkaisia Python-lausekkeita, kuten metodikutsuja, joita kyselymerkkijonot eivät tue.

Suorituskyky on useimmissa tapauksissa samankaltainen; query() voi olla hieman nopeampi erittäin suurilla DataFrameilla, koska se käyttää taustalla numexpr-kirjastoa.

import pandas as pd

df = pd.DataFrame({
    'A': range(10),
    'B': range(10, 20)
})

# Boolean indexing
result_bool = df[(df['A'] > 2) & (df['B'] < 18) & (df['A'] != 5)]

# Equivalent query — much more readable
result_query = df.query('A > 2 and B < 18 and A != 5')

print(result_query)
#    A   B
# 3  3  13
# 4  4  14
# 6  6  16
# 7  7  17

Merkkijonojen vertailu query()-metodissa

Voitte suodattaa merkkijonosarakkeiden arvoja kyselymerkkijonon sisällä ympäröimällä merkkijonoliteraalin lainausmerkeillä. Käyttäkää ulommassa kyselymerkkijonossa kaksoislainausmerkkejä ja merkkijonon arvossa yksinkertaisia lainausmerkkejä tai päinvastoin – kunhan käytäntö pysyy yhtenäisenä. Huomioikaa, että query() ei tue .str-metodeja, kuten contains()-metodia; käyttäkää tällöin totuusarvoindeksointia yhdessä .str-ominaisuuden kanssa.

import pandas as pd

df = pd.DataFrame({
    'country': ['USA', 'UK', 'Canada', 'USA', 'Germany'],
    'sales': [400, 150, 200, 600, 300]
})

# Single quotes for the string value inside double-quoted query
result = df.query('country == "USA"')
print(result)
#   country  sales
# 0     USA    400
# 3     USA    600

in- ja not in -operaattorien käyttäminen

Pandas tukee kyselymerkkijonoissa in- ja not in-operaattoreita jäsenyyden tarkistamiseen Python-listojen tapaan. Tämä on selkeä vaihtoehto useiden ==-ehtojen ketjuttamiselle or-operaattorilla. Arvojen luettelo kirjoitetaan suoraan kyselymerkkijonoon.

import pandas as pd

df = pd.DataFrame({
    'status': ['active', 'inactive', 'pending', 'active', 'closed'],
    'amount': [100, 200, 50, 300, 150]
})

# Keep rows where status is in a specific list
result = df.query('status in ["active", "pending"]')
print(result)
#     status  amount
# 0   active     100
# 2  pending      50
# 3   active     300

# Exclude certain statuses
excluded = df.query('status not in ["closed", "inactive"]')
print(excluded.shape)  # (3, 2)

Numeeriset alueen suodattimet query()-metodilla

Pythonin ketjutetut vertailut, kuten 10 < price < 500, toimivat kyselymerkkijonoissa, joten alueen suodattimet ovat hyvin ilmaisuvoimaisia. Tämä ei onnistu tavallisella totuusarvoindeksoinnilla ilman between()-metodia tai kahta &-operaattorilla yhdistettyä ehtoa.

import pandas as pd

df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D', 'E'],
    'price': [5, 50, 150, 300, 500]
})

# Chained comparison — only works inside query()
result = df.query('50 <= price <= 300')
print(result)
#   product  price
# 1       B     50
# 2       C    150
# 3       D    300

query()-metodin rajoitukset

query() on tehokas, mutta sillä on joitakin rajoituksia. Sarakenimet, joissa on välilyöntejä tai erikoismerkkejä, on ympäröitävä takahipsuilla. Hyvin monimutkaisia Python-lausekkeita, kuten mukautettuja funktioita tai monirivistä logiikkaa, ei tueta merkkijonon sisällä. Lisäksi query() voi tuottaa odottamattomia tuloksia, jos sarakenimet ovat ristiriidassa Pythonin avainsanojen, kuten class tai if, kanssa – ympäröikää myös ne takahipsuilla.

Jos query() ei pysty ilmaisemaan jotakin selkeästi, käyttäkää tavallista totuusarvoindeksointia.

import pandas as pd

df = pd.DataFrame({'first name': ['Alice', 'Bob'], 'class': [1, 2]})

# Backtick-quote column names with spaces or reserved words
result = df.query('`first name` == "Alice" and `class` == 1')
print(result)
#   first name  class
# 0      Alice      1

Käytännön esimerkki: tilausten suodattaminen

Tässä on käytännön esimerkki, jossa query()-metodi yhdistetään muuttujaviittaukseen ja groupby-ketjutukseen. Tässä toimintamallissa suodatetaan ensin ja lasketaan aggregaatit vasta sen jälkeen. Näin vältetään tarpeettomien rivien käsittely, mikä on suurilla aineistoilla sekä selkeämpää että nopeampaa.

import pandas as pd

orders = pd.DataFrame({
    'region': ['East', 'West', 'East', 'West', 'East'],
    'year': [2023, 2023, 2024, 2024, 2024],
    'revenue': [100, 200, 300, 400, 500]
})

min_year = 2024

# Filter to recent orders in the East region, then sum revenue
summary = (
    orders
    .query('year >= @min_year and region == "East"')
    .groupby('region')['revenue'].sum()
)
print(summary)
# region
# East    800
# Name: revenue, dtype: int64

query()-metodin ja metodiketjutuksen parhaat käytännöt

query()-metodin käyttäminen osana metodiketjua on nykyaikaisen Pandas-koodin hyvä käytäntö. Se tekee muunnosketjun jokaisesta vaiheesta selkeän ja itsensä dokumentoivan. Ympäröikää koko ketju sulkeilla, jotta voitte jakaa sen usealle riville ilman kenoviivoja.

Yhdistämällä query()-metodin assign()-metodiin sarakkeiden lisäämistä varten, groupby()-metodiin aggregointeja varten ja pipe()-metodiin mukautettuja funktioita varten voitte rakentaa täysin selkeitä käsittelyketjuja.

import pandas as pd

df = pd.DataFrame({
    'dept': ['Eng', 'HR', 'Eng', 'Sales', 'HR'],
    'salary': [90000, 50000, 120000, 70000, 55000],
    'years': [3, 5, 8, 2, 4]
})

result = (
    df
    .query('years > 2 and dept != "HR"')
    .assign(bonus=lambda x: x['salary'] * 0.1)
    .sort_values('salary', ascending=False)
)
print(result[['dept', 'salary', 'bonus']])
#    dept  salary   bonus
# 2   Eng  120000  12000.0
# 0   Eng   90000   9000.0

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte query()-metodin.

Oppitunnin kertaus

Tässä oppitunnissa opitte, että query() hyväksyy suodatuslausekkeet merkkijonoina, mikä tekee usean ehdon suodattimista luettavampia, @variable_name lisää Python-muuttujia kyselyyn ja että voitte käyttää in/not in -operaattoreita sekä ketjutettuja vertailuja, jotka eivät ole mahdollisia tavallisessa totuusarvoindeksoinnissa. Seuraavaksi tutustumme isin()- ja between()-metodeihin, joilla jäsenyys- ja aluesuodattimet voi kirjoittaa tiiviisti.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”query()-metodi” ilmainen?

Kyllä – oppitunnin ”query()-metodi” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Pandas & NumPy Academy-kurssin, päivitä CoddyKit PROhon. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”query()-metodi”?

Kirjoittakaa luettavia suodatuslausekkeita merkkijonoina query()-metodilla, käyttäkää Python-muuttujia kyselyissä @-merkillä ja ketjuttakaa suodattimia. Harjoittelet Pandas & NumPy Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Pandas & NumPy Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Pandas & NumPy Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”query()-metodi”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Pandas & NumPy Academy-oppitunnilla?

Kyllä. Jokainen Pandas & NumPy Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. DataFrame-olioiden totuusarvoindeksointi
  2. query()-metodi
  3. isin()- ja between()-suodattimet
  4. Sarakkeiden valinta kuvion perusteella
← Takaisin: Pandas & NumPy Academy