Apakah ada fungsi yang setara dengan kombinasi df.isin()
dan df[col].str.contains()
?
Sebagai contoh, katakanlah saya memiliki seri
s = pd.Series(['cat','hat','dog','fog','pet'])
, dan saya ingin menemukan semua tempat yang s
berisi salah satu ['og', 'at']
, saya ingin mendapatkan semuanya kecuali 'hewan peliharaan'.
Saya punya solusi, tapi agak janggal:
searchfor = ['og', 'at']
found = [s.str.contains(x) for x in searchfor]
result = pd.DataFrame[found]
result.any()
Apakah ada cara yang lebih baik untuk melakukan ini?
pd.Series.str.contains
. Jika kinerja menjadi masalah, maka ini mungkin perlu diselidiki.Jawaban:
Salah satu opsinya adalah dengan menggunakan
|
karakter regex untuk mencoba mencocokkan setiap substring dalam kata-kata di Seri Andas
(masih menggunakanstr.contains
).Anda dapat membuat regex dengan menggabungkan kata-kata di
searchfor
with|
:Seperti yang dicatat oleh @AndyHayden pada komentar di bawah, berhati-hatilah jika substring Anda memiliki karakter khusus seperti
$
dan^
yang ingin Anda cocokkan secara harfiah. Karakter ini memiliki arti khusus dalam konteks ekspresi reguler dan akan memengaruhi pencocokan.Anda dapat membuat daftar substring lebih aman dengan keluar dari karakter non-alfanumerik dengan
re.escape
:String dengan dalam daftar baru ini akan cocok dengan setiap karakter secara harfiah saat digunakan dengan
str.contains
.sumber
Anda dapat menggunakan
str.contains
sendiri dengan pola regex menggunakanOR (|)
:Atau Anda bisa menambahkan seri untuk
dataframe
kemudian digunakanstr.contains
:Keluaran:
sumber
df.col.str.contains(r'(?=.*apple)(?=.*banana)',regex=True)
Berikut adalah satu baris lambda yang juga berfungsi:
Memasukkan:
Terapkan Lambda:
Keluaran:
sumber