2016-06-22 13 views
1

オリジナルの形状(4361, 15)dfという名前のデータフレームがあります。 agefm列の値の一部はNaNです。ただ、見て:他の列のNaN値に基づいてpandasデータフレームの値を設定する方法はありますか?

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

をそれから私は、新しい列を作成し、0にそのすべての値を設定します。

df['nevermarr'] = 0 

をだから私は1にnevermarr値を設定したいと思い、その行にagefmはナンです:

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

変更ナッシング:

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

私は何が間違っていますか?

+0

'df [df.agefm.isnull()== True] .nevermarr = 1'を実行すると、既に' isnull'の出力である '== True'を削除できます。それが変わらない場合、私はこのメソッドがあなたのデータフレームのコピーを作成するためだと思います。次に、元のデータフレームではなく、行末に消える一時的なデータフレームを変更します(ただし、わかりません)。とにかく、Jezraelの答えはいつものように良いです。 – 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

恐ろしい))しかし、元のコードはなぜ除外されませんか? – 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-SettingingWithCopy'](http://tomaugspurger.github.io/modern-1.html)をチェックしてください。 – jezrael

関連する問題