Saya ingin memfilter dataframe menggunakan regex pada salah satu kolom.
Untuk contoh yang dibuat-buat:
In [210]: foo = pd.DataFrame({'a' : [1,2,3,4], 'b' : ['hi', 'foo', 'fat', 'cat']})
In [211]: foo
Out[211]:
a b
0 1 hi
1 2 foo
2 3 fat
3 4 cat
Saya ingin memfilter baris ke yang dimulai dengan f
menggunakan regex. Go pertama:
In [213]: foo.b.str.match('f.*')
Out[213]:
0 []
1 ()
2 ()
3 []
Itu tidak terlalu berguna. Namun ini akan membuat saya indeks boolean saya:
In [226]: foo.b.str.match('(f.*)').str.len() > 0
Out[226]:
0 False
1 True
2 True
3 False
Name: b
Jadi saya bisa melakukan pembatasan dengan:
In [229]: foo[foo.b.str.match('(f.*)').str.len() > 0]
Out[229]:
a b
1 2 foo
2 3 fat
Itu membuat saya secara artifisial menempatkan grup ke dalam regex, dan sepertinya mungkin bukan cara yang bersih untuk pergi. Apakah ada cara yang lebih baik untuk melakukan ini?
foo[foo.b.str.startswith("f")]
akan berhasil.foo[foo.b.str.match('(f.*)').str.len() > 0]
adalah solusi yang cukup bagus! Lebih dapat dikustomisasi dan bermanfaat daripada mulai dengan karena ini mengemas fleksibilitas regex di dalamnya.foo[foo.b.str.match('f.*')]
bekerja di panda 0.24.2 untuk saya.Jawaban:
Gunakan mengandung sebagai gantinya:
sumber
df.loc[df.b.str.contains('^f'), :]
df[df.b.str.contains('^f'), :]
Sudah ada fungsi penanganan string
Series.str.startswith()
. Kamu harus mencobanyafoo[foo.b.str.startswith('f')]
.Hasil:
Saya pikir apa yang Anda harapkan.
Atau Anda dapat menggunakan berisi dengan opsi regex. Sebagai contoh:
Hasil:
na=False
adalah untuk mencegah Kesalahan jika ada nilai nan, null dllsumber
df[~df.CITY.str.contains('~.*', regex= True, na=False)]
Pencarian beberapa kolom dengan bingkai data:
sumber
frame
? dan'C:\test\test.txt'
? Sepertinya Anda menjawab pertanyaan yang berbeda.Ini mungkin agak terlambat, tetapi ini sekarang lebih mudah dilakukan di Panda. Anda dapat memanggil pertandingan dengan
as_indexer=True
untuk mendapatkan hasil boolean. Ini didokumentasikan (bersama dengan perbedaan antaramatch
dancontains
) di sini .sumber
Terima kasih atas jawaban yang bagus @ user3136169, berikut adalah contoh bagaimana hal itu dapat dilakukan juga dengan menghapus nilai NoneType.
Anda juga dapat menambahkan regex sebagai argumen:
sumber
Tulis fungsi Boolean yang memeriksa regex dan gunakan terapkan pada kolom
sumber
Menggunakan
str
irisansumber