Python Pandas menggantikan NaN dalam satu kolom dengan nilai dari baris yang sesuai di kolom kedua

98

Saya bekerja dengan Pandas DataFrame ini dengan Python.

File    heat    Farheit Temp_Rating
   1    YesQ         75         N/A
   1    NoR         115         N/A
   1    YesA         63         N/A
   1    NoT          83          41
   1    NoY         100          80
   1    YesZ         56          12
   2    YesQ        111         N/A
   2    NoR          60         N/A
   2    YesA         19         N/A
   2    NoT         106          77
   2    NoY          45          21
   2    YesZ         40          54
   3    YesQ         84         N/A
   3    NoR          67         N/A
   3    YesA         94         N/A
   3    NoT          68          39
   3    NoY          63          46
   3    YesZ         34          81

Saya perlu mengganti semua NaN di Temp_Ratingkolom dengan nilai dari Farheitkolom.

Inilah yang saya butuhkan:

File        heat    Temp_Rating
   1        YesQ             75
   1         NoR            115
   1        YesA             63
   1        YesQ             41
   1         NoR             80
   1        YesA             12
   2        YesQ            111
   2         NoR             60
   2        YesA             19
   2         NoT             77
   2         NoY             21
   2        YesZ             54
   3        YesQ             84
   3         NoR             67
   3        YesA             94
   3         NoT             39
   3         NoY             46
   3        YesZ             81

Jika saya melakukan seleksi Boolean, saya hanya dapat memilih satu dari kolom ini pada satu waktu. Masalahnya adalah jika saya kemudian mencoba bergabung dengan mereka, saya tidak dapat melakukan ini sambil menjaga urutan yang benar.

Bagaimana saya hanya menemukan Temp_Ratingbaris dengan NaNs dan menggantinya dengan nilai di baris Farheitkolom yang sama?

edesz
sumber

Jawaban:

156

Dengan asumsi DataFrame Anda ada di df:

df.Temp_Rating.fillna(df.Farheit, inplace=True)
del df['Farheit']
df.columns = 'File heat Observations'.split()

Pertama, ganti NaNnilai apa pun dengan nilai yang sesuai dari df.Farheit. Hapus 'Farheit'kolom tersebut. Kemudian ganti nama kolomnya. Inilah hasilnya DataFrame:

menghasilkan DataFrame

Jonathan Eunice
sumber
bagaimana bekerja dengan ini jika kedua kolom tipe data adalah objek dan bukannya N / A, itu adalah sel kosong di baris itu?
ashish
Satu pendekatan yang mungkin untuk dipertimbangkan: Anda dapat mengganti string kosong dengan NaN(lihat di sini ) dan kemudian menggunakan pendekatan ini .
edesz
Jawabannya sempurna. Hanya jika Anda ingin lebih banyak menggunakan sintaks pandas, saya sarankan untuk menghapus kolom df.drop("Farheit", axis=1), tapi itu mungkin preferensi pribadi
MichaelA
1
@MichaelA Setuju dropsekarang lebih disukai deldi tanah Pandas. Jika menggunakan Pandas baru-baru ini, akan merekomendasikan df = df.drop(columns='Farheit')penomoran sumbu numerik.
Jonathan Eunice
35

Solusi yang disebutkan di atas tidak berhasil untuk saya. Metode yang saya gunakan adalah:

df.loc[df['foo'].isnull(),'foo'] = df['bar']
zsad512
sumber
3
Apakah itu menimbulkan pengecualian atau tidak berfungsi? Coba isna () bukan isnull ().
RufusVS
3

Cara lain untuk mengatasi masalah ini,

import pandas as pd
import numpy as np

ts_df = pd.DataFrame([[1,"YesQ",75,],[1,"NoR",115,],[1,"NoT",63,13],[2,"YesT",43,71]],columns=['File','heat','Farheit','Temp'])


def fx(x):
    if np.isnan(x['Temp']):
        return x['Farheit']
    else:
        return x['Temp']
print(1,ts_df)
ts_df['Temp']=ts_df.apply(lambda x : fx(x),axis=1)

print(2,ts_df)

kembali:

(1,    File  heat  Farheit  Temp                                                                                    
0     1  YesQ       75   NaN                                                                                        
1     1   NoR      115   NaN                                                                                        
2     1   NoT       63  13.0                                                                                        
3     2  YesT       43  71.0)                                                                                       
(2,    File  heat  Farheit   Temp                                                                                   
0     1  YesQ       75   75.0                                                                                       
1     1   NoR      115  115.0
2     1   NoT       63   13.0
3     2  YesT       43   71.0)
felix_as
sumber