2016-06-22 2 views
1

У меня есть dataframe с именем df с оригинальной формой (4361, 15). Некоторыми значениями столбцов agefm являются NaN. Только посмотрите:Как установить значения в кадре данных pandas на основе значений NaN другого столбца?

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

Затем я создаю новый столбец и установить все его значения 0:

df['nevermarr'] = 0 

Так что я хотел бы установить nevermarr значение 1, то в этой строке agefm является Nan:

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

Ничего не изменилось:

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

Что я делаю неправильно?

+0

Когда вы выполняете 'df [df.agefm.isnull() == True] .nevermarr = 1', вы можете удалить' == True', поскольку он уже является выходом 'isnull'. Тогда, если это не изменится, я предполагаю, что это должно быть потому, что этот метод создает копию вашего фрейма данных. Затем вы изменяете временный фрейм данных, который исчезает в конце строки, а не исходный фрейм данных (но я не уверен). Во всяком случае, ответ Джераэля хорош, как всегда. – ysearka

+0

@ysearka Это похоже на хорошее объяснение)) – Rocketq

ответ

2

Лучше всего использовать 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 

Или используйте loc, ==True может быть опущено:

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

Или 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 

Пример:

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)) Но почему исходный код не работает как исключенный? – Rocketq

+1

[ysearka] (http://stackoverflow.com/questions/37962759/how-set-values-in-pandas-dataframe-based-on-nan-values-of-another-column/37962791#comment63372972_37962759) объясняют это очень хорошо, спасибо. И если вам нужно больше, отметьте [tomaugspurger blog - часть 'SettingWithCopy'] (http://tomaugspurger.github.io/modern-1.html) – jezrael

Смежные вопросы