Pandas & NumPy Academy · Pelajaran

Kaedah query()

Tulis ungkapan penapisan yang mudah dibaca sebagai rentetan dengan query(), gunakan pemboleh ubah Python dalam pertanyaan dengan @, dan rantai penapis.

Pelajaran 2 daripada 413 langkah

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   70000

Peraturan 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      True

Merujuk 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     3979576

Merangkaikan 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      150

Membandingkan 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  17

Perbandingan 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    600

Menggunakan 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    300

Had 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      1

Contoh 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: int64

Amalan 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.0

Semakan 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.

Percuma untuk bermula

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

  1. Pengindeksan Boolean pada DataFrames
  2. Kaedah query()
  3. Penapis isin() dan between()
  4. Memilih Lajur Mengikut Corak
← Kembali ke Pandas & NumPy Academy