Pandas Ganti NaN dengan string kosong / kosong

217

Saya memiliki Bingkai Data Pandas seperti yang ditunjukkan di bawah ini:

    1    2       3
 0  a  NaN    read
 1  b    l  unread
 2  c  NaN    read

Saya ingin menghapus nilai NaN dengan string kosong sehingga terlihat seperti ini:

    1    2       3
 0  a   ""    read
 1  b    l  unread
 2  c   ""    read
pengguna1452759
sumber

Jawaban:

260
import numpy as np
df1 = df.replace(np.nan, '', regex=True)

Ini mungkin bisa membantu. Ini akan mengganti semua NaN dengan string kosong.

nEO
sumber
1
perpustakaan apa yang np.nanberasal? Saya tidak bisa menggunakannya
CaffeineConnoisseur
8
@CaffeineConnoisseur: import numpy as np.
John Zwinck
26
@CaffeineConnoisseur - atau hanya pd.np.nanjika Anda tidak mau import numpyjuga.
elPastor
1
Ini juga memungkinkan Dict untuk disimpan sebagai string di baris .csv dan kemudian membaca kembali ke dalam DataFrame menggunakanpd.DataFrame.from_dict(eval(_string_))
yeliabsalohcin
5
Juga berguna untuk menyebutkan ... inplace=Trueopsi.
smci
340
df = df.fillna('')

atau hanya

df.fillna('', inplace=True)

Ini akan mengisi na (misalnya NaN) dengan ''.

Jika Anda ingin mengisi satu kolom, Anda dapat menggunakan:

df.column1 = df.column1.fillna('')

Orang bisa menggunakan df['column1']sebagai gantinya df.column1.

fantabolous
sumber
5
@Mithril -df[['column1','column2']] = df[['column1','column2']].fillna('')
elPastor
99

Jika Anda membaca kerangka data dari file (misalnya CSV atau Excel), gunakan:

  • df.read_csv(path , na_filter=False)
  • df.read_excel(path , na_filter=False)

Ini secara otomatis akan menganggap bidang kosong sebagai string kosong ''


Jika Anda sudah memiliki kerangka data

  • df = df.replace(np.nan, '', regex=True)
  • df = df.fillna('')
Natesh bhat
sumber
na_filter tidak tersedia di read_excel () pandas.pydata.org/pandas-docs/stable/…
Marjorie Roswell
saya telah menggunakannya dalam aplikasi saya. Memang ada tetapi untuk beberapa alasan, mereka belum memberikan argumen ini dalam dokumen. Ini berfungsi baik untuk saya meskipun tanpa kesalahan.
Natesh bhat
Berhasil, saya menggunakannya dalam parsexl.parse('sheet_name', na_filter=False)
Dmitrii
5

Gunakan formatter, jika Anda hanya ingin memformatnya sehingga membuatnya bagus saat dicetak . Cukup gunakan df.to_string(... formattersuntuk mendefinisikan pemformatan string khusus, tanpa perlu memodifikasi DataFrame Anda atau membuang-buang memori:

df = pd.DataFrame({
    'A': ['a', 'b', 'c'],
    'B': [np.nan, 1, np.nan],
    'C': ['read', 'unread', 'read']})
print df.to_string(
    formatters={'B': lambda x: '' if pd.isnull(x) else '{:.0f}'.format(x)})

Mendapatkan:

   A B       C
0  a      read
1  b 1  unread
2  c      read
Steve Schulist
sumber
4
print df.fillna('')dengan sendirinya (tanpa melakukan df = df.fillna('')) tidak mengubah yang asli juga. Apakah ada kecepatan atau keuntungan lain untuk digunakan to_string?
fantabolous
Cukup adil df.fillna('')!
Steve Schulist
@shadowtalker: Tidak harus, itu hanya akan menjadi jawaban yang benar jika OP ingin menyimpan df dalam satu format (mis. lebih efisien secara komputasi, atau menghemat memori pada string yang tidak perlu / kosong / duplikat), namun membuatnya secara visual dalam lebih banyak cara yang menyenangkan. Tanpa mengetahui lebih lanjut tentang use case, kami tidak dapat mengatakan dengan pasti.
smci
2

Coba ini,

Menambahkan inplace=True

import numpy as np
df.replace(np.NaN, ' ', inplace=True)
Vineesh TP
sumber
1

menggunakan keep_default_na=False akan membantu Anda:

df = pd.read_csv(filename, keep_default_na=False)
Bendy Latortue
sumber
0

Jika Anda mengonversi DataFrame ke JSON, NaNakan memberikan kesalahan sehingga solusi terbaik dalam hal penggunaan ini adalah menggantinya NaNdengan None.
Begini caranya:

df1 = df.where((pd.notnull(df)), None)
Dinesh Khetarpal
sumber
0

Saya mencoba dengan satu kolom nilai string dengan nan.

Untuk menghapus nan dan mengisi string kosong:

df.columnname.replace(np.nan,'',regex = True)

Untuk menghapus nan dan mengisi beberapa nilai:

df.columnname.replace(np.nan,'value',regex = True)

Saya mencoba df.iloc juga. tetapi perlu indeks kolom. jadi Anda perlu melihat ke dalam tabel lagi. cukup metode di atas dikurangi satu langkah.

Subbu VidyaSekar
sumber