Pertama-tama, ketika saya menjalankan ini, tanda baca tidak dihapus, jadi saya bertanya-tanya apakah ada yang salah dengan ekspresi saya?
Kedua, saya mencoba untuk menghasilkan. csv daftar semua kata yang ditandai dengan tanda baca atau tidak, e. g. file teks bertuliskan "Halo. Ini hari yang menyenangkan. " akan keluar
ID, PUNCTUATION, WORD 1, Y, hello 2, Y, its 3, N, a 4, N, nice 5, Y, daySaya tahu saya bisa menggunakannya. split() untuk memisahkan kata-kata tetapi selain itu saya tidak tahu bagaimana cara melakukannya. Bantuan apa pun akan dihargai
Saat bekerja dengan data tekstual, terkadang kita perlu melakukan beberapa transformasi pembersihan. Salah satunya biasanya adalah penghapusan tanda baca yang mungkin terjadi sebelum tokenisasi
Pada artikel hari ini kami akan menampilkan beberapa pendekatan berbeda untuk menghapus tanda baca dari kolom string di pandas DataFrames. Lebih khusus lagi, kami akan membahas penghapusan tanda baca menggunakan
- str.replace()
- regex.sub()
- dan df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope_0
Pertama, mari buat contoh DataFrame yang akan kami rujuk di seluruh artikel ini untuk mendemonstrasikan beberapa konsep
import pandas as pddf = pd.DataFrame(
[
(1, 10, True, 'Hello!!!'),
(2, 15, False, 'Hey..'),
(3, 11, True, 'What?!'),
(4, 12, True, 'Exactly!'),
(5, 17, True, 'Not bad'),
(6, 10, False, 'Yeap.!'),
(7, 12, False, 'Hi. How are you?'),
(8, 19, True, 'Nope,'),
],
columns=['colA', 'colB', 'colC', 'colD']
)print(df)
colA colB colC colD
0 1 10 True Hello!!!
1 2 15 False Hey..
2 3 11 True What?!
3 4 12 True Exactly!
4 5 17 True Not bad
5 6 10 False Yeap.!
6 7 12 False Hi. How are you?
7 8 19 True Nope,
Menggunakan str. replace() dan ekspresi reguler
Opsi pertama yang kita miliki di sini, adalah metode df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope_1 yang dapat digunakan untuk menggantikan setiap kejadian ekspresi reguler yang disediakan dalam objek Seri
Jadi satu ekspresi reguler yang akan membantu kita adalah df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope2. Untuk memahami cara kerja regex ini, pertimbangkan fakta bahwa apa pun yang merupakan tanda baca sebenarnya adalah apa pun yang bukan kata atau kalimat. Jadi kami menggunakan negasi (i. e. df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope_3 ) untuk menunjukkan bahwa kami ingin mengganti non-kata dan non-kalimat (i. e. karakter tanda baca) dengan string kosong
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope_
Menggunakan re. metode sub()
Sekarang alternatif lain adalah metode df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope_4 dalam paket df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope5 yang menyediakan operasi pencocokan ekspresi reguler
df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope_6Kembalikan df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope_7 yang diperoleh dengan mengganti kejadian paling kiri yang tidak tumpang tindih dari df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope8 di df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope9 dengan pengganti import redf['colD']=[re.sub('[^\w\s]+', '', s) for s in df['colD'].tolist()]
print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope0
Kami akan menggunakan ekspresi reguler yang sama yang telah kami gunakan di bagian sebelumnya
import redf['colD']=[re.sub('[^\w\s]+', '', s) for s in df['colD'].tolist()]print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope
Perhatikan juga bahwa terkadang lebih efisien untuk terlebih dahulu mengompilasi ekspresi reguler sebelum substitusi. Sebagai contoh,
r = re.compile(r'[^\w\s]+')
df['colD'] = [r.sub('', s) for s in df['colD'].tolist()]
Menggunakan str. menerjemahkan() metode
Terakhir, pendekatan lain adalah menggunakan metode import redf['colD']=[re.sub('[^\w\s]+', '', s) for s in df['colD'].tolist()]
print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope_1 yang memetakan semua karakter dalam string input melalui tabel pemetaan yang diberikan
Intuisi di balik pendekatan kami adalah menggabungkan semua string pada setiap baris menjadi satu, menjadi string besar, di mana setiap string individu akan dipisahkan oleh pemisah pilihan kami.
Sebagai contoh, kita akan menggunakan karakter import redf['colD']=[re.sub('[^\w\s]+', '', s) for s in df['colD'].tolist()]
print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope2 sebagai pemisah. Jadi pertama-tama kita perlu membuat string yang berisi karakter tanda baca yang ingin kita hilangkan dari string. Perhatikan bahwa pemisah TIDAK HARUS disertakan di sini. Jelas, pemisah yang dipilih tidak boleh ada di salah satu string yang ada jika tidak, pendekatan ini tidak akan berfungsi
punctuation_chars = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{}~'
Sekarang kita perlu menggunakan metode import redf['colD']=[re.sub('[^\w\s]+', '', s) for s in df['colD'].tolist()]
print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope_3 untuk membuat tabel pemetaan untuk terjemahan yang dapat digunakan untuk metode import redf['colD']=[re.sub('[^\w\s]+', '', s) for s in df['colD'].tolist()]
print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope4
Sekarang apa yang perlu kita lakukan pada DataFrame panda kita adalah menggabungkan semua string di kolom import redf['colD']=[re.sub('[^\w\s]+', '', s) for s in df['colD'].tolist()]
print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope5 menggunakan pemisah yang dipilih import redf['colD']=[re.sub('[^\w\s]+', '', s) for s in df['colD'].tolist()]
print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope6. Kemudian lakukan df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope_0 menggunakan tabel pemetaan yang kami buat untuk menghapus karakter tanda baca yang ditentukan dalam import redf['colD']=[re.sub('[^\w\s]+', '', s) for s in df['colD'].tolist()]
print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope8 dan akhirnya import redf['colD']=[re.sub('[^\w\s]+', '', s) for s in df['colD'].tolist()]
print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope9 string yang dihasilkan pada pemisah import redf['colD']=[re.sub('[^\w\s]+', '', s) for s in df['colD'].tolist()]
print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope6 dan tetapkan hasilnya kembali ke kolom
.join(df['colD'].tolist()) \
.translate(mapping_table) \
.split(sep)
Dan kolom target tidak boleh memiliki karakter tanda baca sama sekali
print(df)colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope
Perhatikan bahwa metode ini diimplementasikan dalam C sehingga diharapkan cukup efisien dan cepat
Pikiran Akhir
Dalam tutorial singkat hari ini, kami menjelajahi beberapa pendekatan berbeda yang dapat diterapkan untuk menghapus tanda baca dari kolom string di panda DataFrames
Secara lebih khusus kami memamerkan bagaimana melakukannya, menggunakan tiga pendekatan yang berbeda — str.replace(), df['colD'] = df['colD'].str.replace(r'[^\w\s]+', '')print(df)
colA colB colC colD
0 1 10 True Hello
1 2 15 False Hey
2 3 11 True What
3 4 12 True Exactly
4 5 17 True Not bad
5 6 10 False Yeap
6 7 12 False Hi How are you
7 8 19 True Nope0 dan regex.sub(). Perhatikan bahwa pendekatan yang berbeda mungkin memiliki kinerja yang berbeda secara signifikan (dalam hal kinerja dan efisiensi) pada ukuran kumpulan data yang berbeda. Jadi cara terbaik untuk memilih salah satu yang tepat untuk kasus penggunaan khusus Anda adalah dengan membandingkan hasilnya satu sama lain dan memilih yang lebih sesuai.
Jadilah anggota dan baca setiap cerita di Medium. Biaya keanggotaan Anda secara langsung mendukung saya dan penulis lain yang Anda baca. Anda juga akan mendapatkan akses penuh ke setiap cerita di Medium