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

je travaille avec cette DataFrame Pandas en 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

je dois remplacer tous les NaNs dans le Temp_Rating colonne avec la valeur de la Farheit colonne.

C'est ce dont 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 seule de ces colonnes à la fois. Le problème est que si j'essaie de les rejoindre, Je ne suis pas en mesure de le faire tout en préservant l'ordre correct.

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

41
demandé sur W R 2015-03-21 02:43:01

3 réponses

en supposant que votre DataFrame est en df:

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

remplacer d'abord un NaN valeurs avec la valeur correspondante de df.Farheit. Supprimer le 'Farheit' colonne. Puis renommer les colonnes. Voici la résultante DataFrame:

resulting DataFrame

71
répondu Jonathan Eunice 2015-03-21 00:03:59

Les solutions mentionnées ci-dessus n'ont pas fonctionné pour moi. La méthode que j'ai utilisé était:

df.loc[df['foo'].isnull(),'foo'] = df['bar']
8
répondu zsad512 2017-07-07 14:40:49

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)

renvoie:

(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
répondu felix_as 2017-12-15 18:22:29