Saya mencoba untuk menghapus semua karakter kecuali alfa dan spasi dari kolom, tetapi ketika saya menggunakan kode untuk melakukan hal yang sama, itu memberikan output sebagai 'nan' menggantikan NaN (Nilai Null)

Memasukan data:

col1

ABC ad
YQW \2
AQ4 GH
@34
#45
NaN

Keluaran yang diharapkan:

col1

ABC ad
YQW
AQ GH
NaN
NaN
NaN

Kode yang saya gunakan:

df['col1'] = df['col1'].astype(str).str.extract(r'([A-Za-z]+(?: [A-Za-z]+)*)')

Kemudian saya menggunakan kolom ini untuk memeriksa kondisi NaN tetapi tidak memberikan karena setelah menjalankan skrip di atas itu mengubah nilai NaN menjadi 'nan'.

Catatan: tanpa casting ke string oleh .astype(str), data saya akan mendapatkan "AttributeError: Can only use .str accessor with string values!"

Mohon Sarankan

1
Manz 29 Mei 2021, 00:15

2 jawaban

Jawaban Terbaik

Anda dapat melakukannya dengan langkah-langkah berikut:

  1. Pertama, ganti nilai NaN dengan string kosong (yang mungkin juga kita dapatkan setelah menghapus karakter dan akan diubah kembali menjadi NaN setelahnya).
  2. Transmisikan kolom ke tipe string dengan .astype(str) untuk jika beberapa elemen adalah non-string di kolom.
  3. Ganti string non alfa dan non kosong menjadi string kosong dengan str.replace() dengan ekspresi reguler
  4. Terakhir, ganti string kosong menjadi NaN dengan .replace()

(Catatan: 2 langkah pertama adalah menangani khusus untuk masalah OP mendapatkan AttributeError: Can only use .str accessor with string values! meskipun pengujian saya secara khusus menambahkan integer dan float (bukan integer dan float dalam string tetapi nilai numerik nyata) juga tidak mendapat masalah tanpa 2 yang pertama langkah. Mungkin beberapa tipe data khusus lainnya!?) Pengguna lain tanpa masalah yang sama hanya dapat menggunakan 2 langkah terakhir yang dimulai dengan str.replace().


df['col1'] = df['col1'].fillna('').astype(str).str.replace(r'[^A-Za-z ]', '', regex=True).replace('', np.nan, regex=False)

Hasil:

print(df)


     col1
0  ABC ad
1    YQW 
2   AQ GH
3     NaN
4     NaN
5     NaN

0
SeaBean 28 Mei 2021, 22:37

Cara lain adalah mengekstrak alfanumerik tetapi mengecualikan angka. Lihat kode di bawah ini

df['col1']=df['col1'].str.extract('(\w+\s\w+[^0-9]|\w+[^0-9])')

    col1
0  ABC ad
1    YQW 
2  AQ4 GH
3     NaN
4     NaN
5     NaN
0
wwnde 28 Mei 2021, 21:42