Python-Pandas ersetzen NaN in einer Spalte durch den Wert aus der entsprechenden Zeile der zweiten Spalte

89

Ich arbeite mit diesem 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

Ich muss alle NaNs in der Temp_RatingSpalte durch den Wert aus der FarheitSpalte ersetzen .

Das ist das, was ich benötige:

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

Wenn ich eine boolesche Auswahl mache, kann ich jeweils nur eine dieser Spalten auswählen. Das Problem ist, wenn ich dann versuche, mich ihnen anzuschließen, kann ich dies nicht tun, während ich die richtige Reihenfolge behalte.

Wie kann ich nur Temp_RatingZeilen mit dem NaNs finden und durch den Wert in derselben Zeile der FarheitSpalte ersetzen ?

edesz
quelle

Antworten:

145

Angenommen, Ihr DataFrame befindet sich in df:

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

Ersetzen Sie zuerst alle NaNWerte durch den entsprechenden Wert von df.Farheit. Löschen Sie die 'Farheit'Spalte. Benennen Sie dann die Spalten um. Hier ist das Ergebnis DataFrame:

resultierender DataFrame

Jonathan Eunice
quelle
Wie kann man damit arbeiten, wenn beide Spalten ein Datentyp sind und anstelle von N / A eine leere Zelle in dieser Zeile ist?
Ashish
Ein möglicher Ansatz: Sie können zuerst die leere Zeichenfolge durch NaN(siehe hier ) ersetzen und dann diesen Ansatz verwenden.
Edesz
Die Antwort ist perfekt. Nur wenn Sie mehr in der Pandas-Syntax bleiben df.drop("Farheit", axis=1)möchten, würde ich vorschlagen, Spalten nach zu löschen , aber das ist wahrscheinlich Ihre persönliche Präferenz
MichaelA
@MichaelA Zustimmen dropjetzt lieber delin Pandas-Land. Wenn Sie einen neueren Pandas verwenden, empfehlen df = df.drop(columns='Farheit')Sie eine numerische Achsnummerierung.
Jonathan Eunice
31

Die oben genannten Lösungen haben bei mir nicht funktioniert. Die Methode, die ich verwendet habe, war:

df.loc[df['foo'].isnull(),'foo'] = df['bar']
zsad512
quelle
2
Hat es eine Ausnahme ausgelöst oder einfach nicht funktioniert? Versuchen Sie isna () anstelle von isnull ().
RufusVS
3

Ein anderer Weg, um dieses Problem zu lösen,

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)

kehrt zurück:

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