Ganti Tidak Ada dengan NaN di pandas dataframe

99

Saya punya meja x:

        website
0   http://www.google.com/
1   http://www.yahoo.com
2   None

Saya ingin mengganti python None dengan pandas NaN. Saya mencoba:

x.replace(to_replace=None, value=np.nan)

Tapi saya mendapat:

TypeError: 'regex' must be a string or a compiled regular expression or a list or dict of strings or regular expressions, you passed a 'bool'

Bagaimana saya harus melakukannya?

AdamNYC
sumber

Jawaban:

145

Anda dapat menggunakan DataFrame.fillnaatau Series.fillnayang akan menggantikan objek Python None, bukan string 'None'.

import pandas as pd
import numpy as np

Untuk dataframe:

df = df.fillna(value=np.nan)

Untuk kolom atau seri:

df.mycol.fillna(value=np.nan, inplace=True)
Guillaume Jacquenot
sumber
3
Jika Anda mengimpor data dari database SQL, Anda dapat menggabungkannya dengan jawaban di bawah ini. Ini mengubah Tidak Ada (yang bukan string) menjadi NaN. Kemudian Anda bisa df['column'].replace(nan, "", inplace=True)jika mengatakan Anda ingin None menjadi string kosong.
VISQL
1
Jawaban ini tidak berhasil untuk saya; itu tidak menggantikan None. Jawaban Max berhasil.
Daniel
Saya menemukan ini solusi kolom khusus untuk menjadi yang paling efektif: df['website'].replace(pd.np.nan, 0, inplace=True). Ini juga tidak memerlukan Numpy untuk disertakan, dengan mengandalkan referensi bawaan Pandas.
CodeMantle
2
pd.np.nansekarang memberi FutureWarning: The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead.
Alex Povel
16

Berikut opsi lain:

df.replace(to_replace=[None], value=np.nan, inplace=True)
Nickolai
sumber
3
Harap berhati-hati ketika Anda menjalankan df.replace ([None], np.nan, inplace = True), ini mengubah semua objek datetime dengan data yang hilang menjadi dtypes objek. Jadi sekarang Anda mungkin telah merusak kueri kecuali jika Anda mengubahnya kembali ke tanggal waktu yang dapat melelahkan bergantung pada ukuran data Anda.
Doubledown
15

Baris berikut diganti Nonedengan NaN:

df['column'].replace('None', np.nan, inplace=True)
Max Izadi
sumber
Cukup periksa dua kali, itu berhasil untuk saya. Apakah Anda mendapatkan kesalahan atau nilai 'Tidak Ada' tidak diganti?
Max Izadi
NB: metode ini menggunakan np.nan, yang memiliki tipe dt float (mis .:) float64, sebagai lawan dari dtype default panda objectuntuk kolom nan.
tehfink
6
Perhatikan: Ini menggantikan string dengan teks "Tidak Ada", tetapi tidak dengan nilai Tidak ada yang eksplisit ( Tidak ada seperti dalam konstanta ).
Gregor Müllegger
4

Jika Anda menggunakan df.replace ([None], np.nan, inplace = True), ini mengubah semua objek datetime dengan data yang hilang menjadi dtypes objek. Jadi sekarang Anda mungkin telah merusak kueri kecuali jika Anda mengubahnya kembali ke tanggal waktu yang dapat melelahkan bergantung pada ukuran data Anda.

Jika Anda ingin menggunakan metode ini, pertama-tama Anda dapat mengidentifikasi bidang objek dtype di df Anda dan kemudian mengganti Tidak ada:

obj_columns = list(df.select_dtypes(include=['object']).columns.values)
df[obj_columns] = df[obj_columns].replace([None], np.nan)
Doubledown
sumber
0
DataFrame['Col_name'].replace("None", np.nan, inplace=True)
Ashish Sharma
sumber
1
Hai dan selamat datang di stackoverflow, dan terima kasih telah menjawabnya. Meskipun kode ini mungkin menjawab pertanyaan, dapatkah Anda mempertimbangkan untuk menambahkan penjelasan tentang masalah yang Anda pecahkan, dan bagaimana Anda menyelesaikannya? Ini akan membantu pembaca di masa mendatang untuk memahami jawaban Anda dengan lebih baik dan belajar darinya.
Plutian