Kaedah query()
Tulis ungkapan penapisan yang mudah dibaca sebagai rentetan dengan query(), gunakan pemboleh ubah Python dalam pertanyaan dengan @, dan rantai penapis.
Kaedah query() ialah pelajaran Pandas & NumPy Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pandas & NumPy Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pandas & NumPy Academy merangkumi sejumlah 4 pelajaran.
Mengapa Menggunakan query()?
Pengindeksan boolean Pandas berkuasa, tetapi boleh menjadi panjang lebar apabila menggabungkan banyak syarat. Kaedah query() membolehkan anda menulis ungkapan penapisan sebagai rentetan biasa, yang dianggap lebih mudah dibaca oleh ramai orang — khususnya mereka yang datang daripada latar belakang SQL. Daripada df[(df['age'] > 30) & (df['salary'] > 50000)], anda boleh menulis df.query('age > 30 and salary > 50000').
Rentetan query dinilai berdasarkan nama lajur DataFrame, jadi nama lajur bertindak seperti nama pemboleh ubah di dalam rentetan tersebut.
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 70000Peraturan Sintaks dalam Rentetan Query
Dalam rentetan query, anda boleh menggunakan operator perbandingan Python standard (>, <, ==, !=, >=, <=) serta penyambung logik and, or, not. Tidak seperti pengindeksan boolean biasa, anda boleh menggunakan perkataan bahasa Inggeris di sini — tidak perlu menggunakan ampersand atau paip.
Nama lajur yang mengandungi ruang atau bertembung dengan kata kunci Python mesti diletakkan dalam tanda petik belakang: 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 TrueMerujuk Pemboleh Ubah Python dengan @
Ciri penting query() ialah keupayaan untuk merujuk pemboleh ubah Python daripada skop sekeliling menggunakan awalan @. Ini memudahkan anda menetapkan parameter penapis: kira ambang, simpan nilainya dalam pemboleh ubah, kemudian gunakan @variable_name dalam rentetan query dan bukannya menetapkan nilai secara terus.
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 3979576Merangkaikan Panggilan query()
Memandangkan query() mengembalikan DataFrame baharu, anda boleh merangkaikan beberapa panggilan query atau menggabungkannya dengan kaedah Pandas lain dalam satu saluran pemprosesan. Perangkaian memastikan setiap langkah penapisan berada pada barisnya sendiri, lalu memudahkan logik dibaca, dinyahpepijat dan diubah suai.
Anda juga boleh merangkaikan query() dengan kaedah seperti .groupby(), .sort_values() atau .head() untuk membina saluran analisis yang ringkas.
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 150Membandingkan query() dengan Pengindeksan Boolean
Kedua-dua kaedah menghasilkan keputusan yang sama, tetapi setiap satunya sesuai untuk keadaan tertentu. query() amat baik untuk penapis dengan berbilang syarat yang memerlukan banyak tanda kurung jika menggunakan pengindeksan boolean. Pengindeksan boolean pula lebih sesuai apabila syarat anda melibatkan ungkapan Python yang kompleks, seperti panggilan kaedah yang tidak disokong dalam rentetan query.
Prestasinya serupa dalam kebanyakan keadaan; query() mungkin sedikit lebih pantas pada DataFrame yang sangat besar kerana menggunakan pustaka numexpr secara dalaman.
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 17Perbandingan Rentetan dalam query()
Anda boleh menapis nilai lajur rentetan dalam rentetan query dengan meletakkan literal rentetan dalam tanda petik. Gunakan tanda petik berganda untuk rentetan query luar dan tanda petik tunggal untuk nilai rentetan, atau sebaliknya — yang penting, gunakan secara konsisten. Perhatikan bahawa query() tidak menyokong kaedah .str seperti contains(); untuk keadaan tersebut, gunakan pengindeksan boolean dengan .str.
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 600Menggunakan Operator in dan not in
Dalam rentetan query, Pandas menyokong operator in dan not in untuk menguji keahlian, serupa seperti senarai Python. Ini ialah alternatif yang kemas berbanding merangkaikan berbilang syarat == dengan or. Senarai nilai ditulis terus dalam rentetan query.
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)Penapis Julat Berangka dengan query()
Perbandingan berantai Python seperti 10 < price < 500 berfungsi dalam rentetan query, menjadikan penapis julat sangat ekspresif. Perkara ini tidak boleh dilakukan dengan pengindeksan boolean standard tanpa menggunakan between() atau dua syarat berasingan yang digabungkan dengan &.
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 300Had query()
query() berkuasa, tetapi mempunyai beberapa had. Nama lajur yang mengandungi ruang atau aksara khas memerlukan tanda petik belakang. Ungkapan Python yang sangat kompleks, seperti fungsi tersuai dan logik berbilang baris, tidak disokong dalam rentetan tersebut. Selain itu, query() mungkin menghasilkan keputusan yang tidak dijangka jika nama lajur bertembung dengan kata kunci Python seperti class atau if — gunakan tanda petik belakang untuk kedua-duanya.
Untuk perkara yang tidak dapat dinyatakan dengan kemas oleh query(), gunakan pengindeksan boolean standard sebagai pilihan sandaran.
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 1Contoh Praktikal: Menapis Pesanan
Berikut ialah demonstrasi praktikal yang menggabungkan query() dengan rujukan pemboleh ubah dan perangkaian kepada groupby. Corak ini — tapis dahulu, kemudian agregat — mengelakkan pemprosesan baris yang tidak diperlukan, menjadikannya lebih jelas dan pantas pada set data besar.
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: int64Amalan Terbaik query() dan Perangkaian Kaedah
Menggunakan query() dalam rantaian kaedah ialah amalan terbaik dalam kod Pandas moden. Ini menjadikan setiap langkah dalam saluran pemprosesan transformasi jelas dan menerangkan dirinya sendiri. Balut seluruh rantaian dalam tanda kurung supaya anda boleh memecahkannya kepada beberapa baris tanpa garis condong songsang.
Gabungkan query() dengan assign() untuk menambah lajur, groupby() untuk pengagregatan dan pipe() untuk fungsi tersuai bagi membina saluran pemprosesan yang mudah dibaca sepenuhnya.
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.0Semakan Pantas
Uji pemahaman anda tentang kaedah query().
Imbas Kembali Pelajaran
Dalam pelajaran ini, anda telah mempelajari bahawa: query() menerima ungkapan penapisan sebagai rentetan, lalu menjadikan penapis berbilang syarat lebih mudah dibaca; @variable_name memasukkan pemboleh ubah Python ke dalam query; dan anda boleh menggunakan in/not in serta perbandingan berantai yang tidak boleh digunakan dengan pengindeksan boolean standard. Seterusnya, kita akan meneroka isin() dan between() untuk penapis keahlian dan julat yang ringkas.
Pelajari Python dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “Kaedah query()” percuma?
Ya — teks penuh “Kaedah query()” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Pandas & NumPy Academy, tingkat taraf kepada CoddyKit PRO. Kursus Pandas & NumPy Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Kaedah query()”?
Tulis ungkapan penapisan yang mudah dibaca sebagai rentetan dengan query(), gunakan pemboleh ubah Python dalam pertanyaan dengan @, dan rantai penapis. Anda berlatih Pandas & NumPy Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Pandas & NumPy Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Pandas & NumPy Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Kaedah query()” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pengindeksan Boolean pada DataFrames
- Kaedah query()
- Penapis isin() dan between()
- Memilih Lajur Mengikut Corak