Python Pandas reemplaza NaN en una columna con el valor de la fila correspondiente de la segunda columna

97

Estoy trabajando con este Pandas DataFrame en 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

Necesito reemplazar todos los NaN en la Temp_Ratingcolumna con el valor de la Farheitcolumna.

Esto es lo que necesito:

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

Si hago una selección booleana, puedo seleccionar solo una de estas columnas a la vez. El problema es que si intento unirme a ellos, no puedo hacerlo mientras conservo el orden correcto.

¿Cómo puedo encontrar solo Temp_Ratingfilas con NaNs y reemplazarlas con el valor en la misma fila de la Farheitcolumna?

edesz
fuente

Respuestas:

156

Suponiendo que su DataFrame está en df:

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

Primero reemplace cualquier NaNvalor con el valor correspondiente de df.Farheit. Elimina la 'Farheit'columna. Luego cambie el nombre de las columnas. Aquí está el resultado DataFrame:

DataFrame resultante

Jonathan Eunice
fuente
¿Cómo trabajar con esto si el tipo de datos de ambas columnas es un objeto y en lugar de N / A, es una celda vacía en esa fila?
ashish
Un posible enfoque a considerar: primero puede reemplazar la cadena vacía por NaN(ver aquí ) y luego usar este enfoque.
edesz
La respuesta es perfecta. Solo si desea permanecer más en la sintaxis de pandas, sugeriría eliminar columnas por df.drop("Farheit", axis=1), pero esa es probablemente una preferencia personal
MichaelA
1
@MichaelA De acuerdo dropahora se prefiere delen Pandas-land. Si usa un Pandas reciente, lo recomendaría df = df.drop(columns='Farheit')sobre la numeración de ejes numéricos.
Jonathan Eunice
35

Las soluciones mencionadas anteriormente no funcionaron para mí. El método que utilicé fue:

df.loc[df['foo'].isnull(),'foo'] = df['bar']
zsad512
fuente
3
¿Presentó una excepción o simplemente no funcionó? Pruebe isna () en lugar de isnull ().
RufusVS
3

Otra forma de resolver este problema,

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)

devoluciones:

(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
fuente