Saya punya DataFrame
dengan 4 kolom yang 2 berisi nilai string. Saya bertanya-tanya apakah ada cara untuk memilih baris berdasarkan kecocokan string parsial terhadap kolom tertentu?
Dengan kata lain, fungsi atau fungsi lambda yang akan melakukan sesuatu seperti
re.search(pattern, cell_in_question)
mengembalikan boolean. Saya kenal dengan sintaks df[df['A'] == "hello world"]
tetapi sepertinya tidak dapat menemukan cara untuk melakukan hal yang sama dengan kata string match parsial 'hello'
.
Apakah seseorang dapat mengarahkan saya ke arah yang benar?
df[df['A'].str.contains("Hello|Britain")]
.str.contains
menggunakan.query()
api ?df[df['value'].astype(str).str.contains('1234.+')]
untuk memfilter kolom non-string-type.Saya mencoba solusi yang diusulkan di atas:
dan mendapat kesalahan:
Anda dapat mengubah nilai NA menjadi
False
, seperti ini:sumber
df[df['A'].astype(str).str.contains("Hello|Britain")]
bekerja jugaPosting ini dimaksudkan untuk pembaca yang ingin
isin
)... dan ingin tahu lebih banyak tentang metode apa yang harus disukai daripada yang lain.
(PS: Saya sudah melihat banyak pertanyaan tentang topik yang sama, saya pikir akan baik untuk meninggalkan ini di sini.)
Pencarian Substring Dasar
str.contains
dapat digunakan untuk melakukan pencarian substring atau pencarian berbasis regex. Pencarian default untuk berbasis regex kecuali Anda menonaktifkannya secara eksplisit.Berikut adalah contoh pencarian berbasis regex,
Terkadang pencarian regex tidak diperlukan, jadi tentukan
regex=False
untuk menonaktifkannya.Dari segi kinerja, pencarian regex lebih lambat daripada pencarian substring:
Hindari menggunakan pencarian berbasis regex jika Anda tidak membutuhkannya.
Mengatasi
ValueError
sKadang-kadang, melakukan pencarian substring dan memfilter pada hasil akan menghasilkan
Ini biasanya karena data campuran atau NaN di kolom objek Anda,
Apa pun yang bukan string tidak dapat menerapkan metode string di dalamnya, sehingga hasilnya adalah NaN (secara alami). Dalam hal ini, tentukan
na=False
untuk mengabaikan data non-string,Beberapa Pencarian Substring
Ini paling mudah dicapai melalui pencarian regex menggunakan regex ATAU pipa.
Anda juga dapat membuat daftar istilah, lalu bergabung dengan mereka:
Terkadang, adalah bijaksana untuk melarikan diri dari istilah Anda jika mereka memiliki karakter yang dapat diartikan sebagai regach metacharacters . Jika istilah Anda mengandung karakter berikut ...
Kemudian, Anda harus menggunakan
re.escape
untuk melarikan diri dari mereka:re.escape
memiliki efek melarikan diri dari karakter khusus sehingga mereka diperlakukan secara harfiah.Mencocokkan Seluruh Kata
Secara default, pencarian substring mencari substring / pola yang ditentukan terlepas dari apakah itu kata penuh atau tidak. Untuk hanya mencocokkan kata-kata penuh, kita perlu menggunakan ekspresi reguler di sini — khususnya, pola kita perlu menentukan batas kata (
\b
).Sebagai contoh,
Sekarang pertimbangkan,
v / s
Pencarian Banyak Kata Utuh
Mirip dengan di atas, kecuali kami menambahkan batas kata (
\b
) ke pola bergabung.Di mana
p
terlihat seperti ini,Alternatif Hebat: Gunakan Daftar Pemahaman !
Karena kamu bisa! Dan kamu harus! Mereka biasanya sedikit lebih cepat daripada metode string, karena metode string sulit untuk vectorise dan biasanya memiliki implementasi gila.
Dari pada,
Gunakan
in
operator di dalam daftar comp,Dari pada,
Gunakan
re.compile
(untuk me-cache regex Anda) +Pattern.search
di dalam daftar comp,Jika "col" memiliki NaN, maka alih-alih
Menggunakan,
Lebih Pilihan untuk Partial String Matching:
np.char.find
,np.vectorize
,DataFrame.query
.Selain
str.contains
dan daftar pemahaman, Anda juga dapat menggunakan alternatif berikut.np.char.find
Mendukung pencarian substring (baca: tidak ada regex) saja.
np.vectorize
Ini adalah pembungkus di sekitar lingkaran, tetapi dengan overhead yang lebih rendah daripada kebanyakan
str
metode panda .Solusi Regex mungkin:
DataFrame.query
Mendukung metode string melalui mesin python. Ini tidak menawarkan manfaat kinerja yang terlihat, tetapi tetap berguna untuk mengetahui apakah Anda perlu secara dinamis menghasilkan pertanyaan Anda.
Informasi lebih lanjut tentang
query
daneval
keluarga metode dapat ditemukan di Dinamis Ekspresi Evaluasi di panda menggunakan pd.eval () .Prioritas Penggunaan yang Disarankan
str.contains
, karena kesederhanaannya dan kemudahan dalam menangani NaN dan data campurannp.vectorize
df.query
sumber
any(needle in haystack for needling in ['foo', 'bar'] and haystack in (df['col'], df['col2']))
dan variasi saya mencoba semua tersedak (itu mengeluh tentangany()
dan memang begitu ... Tapi dokter itu tidak jelas bagaimana cara melakukan permintaan seperti itu.df[['col1', 'col2']].apply(lambda x: x.str.contains('foo|bar')).any(axis=1)
Jika ada yang bertanya-tanya bagaimana melakukan masalah yang terkait: "Pilih kolom dengan string parsial"
Menggunakan:
Dan untuk memilih baris menurut pencocokan string parsial, berikan
axis=0
filter:sumber
df.loc[:, df.columns.str.contains('a')]
df.filter(like='a')
Catatan cepat: jika Anda ingin melakukan seleksi berdasarkan string parsial yang terdapat dalam indeks, coba yang berikut ini:
sumber
Katakanlah Anda memiliki yang berikut ini
DataFrame
:Anda selalu dapat menggunakan
in
operator dalam ekspresi lambda untuk membuat filter Anda.Kuncinya di sini adalah dengan menggunakan
axis=1
opsi dalamapply
untuk meneruskan elemen ke fungsi lambda, baris demi baris, berlawanan dengan kolom demi kolom.sumber
Inilah yang akhirnya saya lakukan untuk pencocokan string parsial. Jika ada yang memiliki cara yang lebih efisien untuk melakukan ini, beri tahu saya.
sumber
Menggunakan berisi tidak berfungsi dengan baik untuk string saya dengan karakter khusus. Cari bekerja.
sumber
Ada jawaban sebelum ini yang memenuhi fitur yang diminta, toh saya ingin menunjukkan cara yang paling umum:
Dengan cara ini, mari Anda mendapatkan kolom yang Anda cari apa pun caranya.
(Jelas, Anda harus menulis ekspresi regex yang tepat untuk setiap kasus)
sumber
Mungkin Anda ingin mencari beberapa teks di semua kolom dari kerangka data Pandas, dan tidak hanya di subset dari mereka. Dalam hal ini, kode berikut akan membantu.
Peringatan. Metode ini relatif lambat, meskipun nyaman.
sumber
Jika Anda perlu melakukan pencarian case untuk string dalam kolom dataframe panda:
sumber