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

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.


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.


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('')

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

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)

1

menggunakan keep_default_na=False akan membantu Anda:

df = pd.read_csv(filename, keep_default_na=False)

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)

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.