web-dev-qa-db-fra.com

Python Pandas remplace NaN dans une colonne par la valeur de la ligne correspondante de la deuxième colonne

Je travaille avec ceci Pandas DataFrame in Python 2.7.

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

J'ai besoin de remplacer tous les NaN dans le Temp_Rating colonne avec la valeur de la colonne Farheit.

C'est de quoi j'ai besoin:

File        heat    Observation
   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 je fais une sélection booléenne, je ne peux choisir qu'une de ces colonnes à la fois. Le problème est que si j'essaie ensuite de les rejoindre, je ne peux pas le faire tout en préservant le bon ordre.

Comment puis-je seulement trouver Temp_Rating rangées avec le NaNs et les remplacer par la valeur dans la même rangée de la colonne Farheit?

60
edesz

En supposant que votre DataFrame soit dans df:

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

Remplacez d’abord les valeurs NaN par la valeur correspondante de df.Farheit. Supprimer le 'Farheit' colonne. Puis renommez les colonnes. Voici le résultat DataFrame:

resulting DataFrame

96
Jonathan Eunice

Les solutions mentionnées ci-dessus ne fonctionnaient pas pour moi. La méthode que j'ai utilisée était:

df.loc[df['foo'].isnull(),'foo'] = df['bar']
13
zsad512

Une autre façon de résoudre ce problème,

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)

résultats:

(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)
1
felix_as