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.

Mark Morrisson
sumber
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:

124

gunakan saja replace:

In [106]:
df.replace('N/A',np.NaN)

Out[106]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN

Apa yang Anda coba disebut pengindeksan berantai: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

Anda dapat menggunakan locuntuk memastikan Anda beroperasi pada dF asli:

In [108]:
df.loc[df['y'] == 'N/A','y'] = np.nan
df

Out[108]:
    x    y
0  10   12
1  50   11
2  18  NaN
3  32   13
4  47   15
5  20  NaN
EdChum
sumber
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
Severin Pappadeux
sumber
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

jmorrison
sumber
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.

slevin886
sumber
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.

jeremie benichou
sumber
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
rolandpeng
sumber
0

df.replace ('nilai kolom', np.NaN, inplace = True)

sameer_nubia
sumber