Cara mengatur sel ke NaN dalam bingkai data panda


98

Saya ingin mengganti nilai buruk di kolom kerangka data dengan NaN.

mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)

df[df.y == 'N/A']['y'] = np.nan

Padahal, baris terakhir gagal dan mengeluarkan peringatan karena itu bekerja pada salinan df. Jadi, bagaimana cara yang benar untuk mengatasinya? Saya telah melihat banyak solusi dengan iloc atau ix tetapi di sini, saya perlu menggunakan kondisi boolean.


Saya merasa judulnya menyesatkan. Masalahnya bukan karena Anda menginginkan NaN dalam kerangka data Anda. Masalahnya adalah Anda "mencoba untuk menyetel salinan potongan dari DataFrame".
Teepeemm

Jawaban:



13

Saat menggunakan replacetampaknya menyelesaikan masalah, saya ingin mengusulkan alternatif. Masalah dengan campuran nilai numerik dan beberapa nilai string di kolom tidak harus mengganti string dengan np.nan, tetapi untuk membuat seluruh kolom tepat. Saya berani bertaruh bahwa kolom asli kemungkinan besar adalah tipe objek

Name: y, dtype: object

Yang benar-benar Anda butuhkan adalah membuatnya menjadi kolom numerik (akan memiliki tipe yang tepat dan akan lebih cepat), dengan semua nilai non-numerik diganti dengan NaN.

Dengan demikian, kode konversi yang baik akan menjadi

pd.to_numeric(df['y'], errors='coerce')

Tentukan errors='coerce'untuk memaksa string yang tidak dapat diurai menjadi nilai numerik menjadi NaN. Jenis kolom akan menjadi

Name: y, dtype: float64

10

Anda dapat menggunakan ganti:

df['y'] = df['y'].replace({'N/A': np.nan})

Perhatikan juga inplaceparameter untuk replace. Anda dapat melakukan sesuatu seperti:

df.replace({'N/A': np.nan}, inplace=True)

Ini akan menggantikan semua contoh di df tanpa membuat salinan.

Demikian pula, jika Anda menemukan jenis nilai yang tidak diketahui seperti string kosong atau nilai Tidak ada:

df['y'] = df['y'].replace({'': np.nan})

df['y'] = df['y'].replace({None: np.nan})

Referensi: Panda Terbaru - Ganti


2

Mulai pandas 1.0.0, Anda tidak perlu lagi menggunakan numpy untuk membuat nilai null di dataframe Anda. Sebagai gantinya Anda bisa menggunakan pandas.NA (yang berjenis pandas._libs.missing.NAType), jadi ini akan diperlakukan sebagai null dalam dataframe tetapi tidak akan menjadi null di luar konteks dataframe.


Meskipun ini tidak menyelesaikan masalah OP, saya memberi suara positif karena itu benar-benar menjawab pertanyaan di judul.
Teepeemm

1
df.loc[df.y == 'N/A',['y']] = np.nan

Ini memecahkan masalah Anda. Dengan ganda [], Anda sedang mengerjakan salinan DataFrame. Anda harus menentukan lokasi yang tepat dalam satu panggilan untuk dapat mengubahnya.


0

Anda dapat mencoba cuplikan ini.

Dalam [16]: mydata = {'x': [10, 50, 18, 32, 47, 20], 'y': ['12', '11', 'N / A', '13', ' 15 ',' T / A ']}
Dalam [17]: df = pd.DataFrame (mydata)

Dalam [18]: df.y [df.y == "N / A"] = np.nan

Keluar [19]: df 
    xy
0 10 12
1 50 11
2 18 NaN
3 32 13
4 47 15
5 20 NaN

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.