'Python Pandas replace NaN in one column with value from corresponding row of second column
I am working with this Pandas DataFrame in 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
I need to replace all NaNs in the Temp_Rating column with the value from the Farheit column.
This is what I need:
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
If I do a Boolean selection, I can pick out only one of these columns at a time. The problem is if I then try to join them, I am not able to do this while preserving the correct order.
How can I only find Temp_Rating rows with the NaNs and replace them with the value in the same row of the Farheit column?
Solution 1:[1]
Assuming your DataFrame is in df:
df.Temp_Rating.fillna(df.Farheit, inplace=True)
del df['Farheit']
df.columns = 'File heat Observations'.split()
First replace any NaN values with the corresponding value of df.Farheit. Delete the 'Farheit' column. Then rename the columns. Here's the resulting DataFrame:

Solution 2:[2]
The above mentioned solutions did not work for me. The method I used was:
df.loc[df['foo'].isnull(),'foo'] = df['bar']
Solution 3:[3]
An other way to solve this problem,
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)
returns:
(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)
Solution 4:[4]
@Jonathan's answer is good, but an overkill, just use pop:
df['Temp_Rating'] = df['Temp_Rating'].fillna(df.pop('Farheit'))
Solution 5:[5]
The accepted answer uses fillna() which will fill in missing values where the two dataframes share indices.  As explained nicely here, you can use combine_first to fill in missing values, rows and index values for situations where the indices of the two dataframes don't match.
df.Col1 = df.Col1.fillna(df.Col2) #fill in missing values if indices match
#or 
df.Col1 = df.Col1.combine_first(df.Col2) #fill in values, rows, and indices
Solution 6:[6]
You can also use mask which replaces the values where Temp_Rating is NaN by the column Farheit:
df['Temp_Rating'] = df['Temp_Rating'].mask(df['Temp_Rating'].isna(), df['Farheit'])
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | |
| Solution 2 | zsad512 | 
| Solution 3 | Markus Dutschke | 
| Solution 4 | U12-Forward | 
| Solution 5 | John | 
| Solution 6 | rachwa | 
