query()-metodi
Kirjoittakaa luettavia suodatuslausekkeita merkkijonoina query()-metodilla, käyttäkää Python-muuttujia kyselyissä @-merkillä ja ketjuttakaa suodattimia.
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 70000Kyselymerkkijonon 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 TruePython-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 3979576query()-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 150query()-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 17Merkkijonojen 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 600in- 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 300query()-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 1Kä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: int64query()-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.0Pikatarkistus
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.
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
- DataFrame-olioiden totuusarvoindeksointi
- query()-metodi
- isin()- ja between()-suodattimet
- Sarakkeiden valinta kuvion perusteella