2016-06-22 4 views
1

Ich habe Datenframe namens df mit Originalform (4361, 15). Einige Werte der Spalte agefm sind NaN. Sehen Sie nur:Wie setzen Werte im Pandas-Datenrahmen auf NaN-Werten einer anderen Spalte?

> df[df.agefm.isnull() == True].agefm.shape 
(2282,) 

Dann erstelle ich neue Spalte und stellen Sie alle Werte auf 0:

df['nevermarr'] = 0 

So würde Ich mag nevermarr Wert auf 1 setzen, dann in dieser Zeile agefm ist Nan:

df[df.agefm.isnull() == True].nevermarr = 1 

nichts geändert:

> df['nevermarr'].sum() 
0 

Was mache ich falsch?

+0

Wenn Sie 'df [df.agefm.isnull() == True] .nevermarr = 1 'verwenden, können Sie das' == True' löschen, da es bereits die Ausgabe von 'isnull' ist. Dann, wenn es sich nicht ändert, denke ich, dass es sein muss, weil diese Methode eine Kopie Ihres Datenrahmens erstellt. Dann ändern Sie einen temporären Datenrahmen, der am Ende der Zeile verschwindet, nicht Ihren ursprünglichen Datenrahmen (aber ich bin mir nicht sicher). Wie auch immer, Jezraels Antwort ist gut. – ysearka

+0

@ysearka Das scheint eine gute Erklärung zu sein)) – Rocketq

Antwort

2

Die beste Verwendung ist numpy.where:

df['nevermarr'] = np.where(df.agefm.isnull(), 1, 0) 
print (df) 
    agefm nevermarr 
0 NaN   1 
1 5.0   0 
2 6.0   0 

Oder verwenden loc kann ==True weggelassen werden:

df.loc[df.agefm.isnull(), 'nevermarr'] = 1 

Oder mask:

df['nevermarr'] = df.nevermarr.mask(df.agefm.isnull(), 1) 
print (df) 
    agefm nevermarr 
0 NaN   1 
1 5.0   2 
2 6.0   3 

Probe:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'nevermarr':[7,2,3], 
        'agefm':[np.nan,5,6]}) 

print (df) 
    agefm nevermarr 
0 NaN   7 
1 5.0   2 
2 6.0   3 

df.loc[df.agefm.isnull(), 'nevermarr'] = 1 
print (df) 
    agefm nevermarr 
0 NaN   1 
1 5.0   2 
2 6.0   3 
+0

Awesome)) Aber warum funktioniert der ursprüngliche Code nicht als Ausnahme? – Rocketq

+1

[ysearka] (http://stackoverflow.com/questions/37962759/how-set-values-in-pandas-dataframe-based-on-nan-values-of-another-column/37962791#comment63372972_37962759) erkläre es sehr nett, danke. Und wenn du mehr brauchst, schau mal nach [tomauggger blog - part 'SettingWithCopy'] (http://tomaugspurger.github.io/modern-1.html) – jezrael

Verwandte Themen