2017-01-30 10 views
3

これはおそらく単純な解決策があるように感じますが、私はそれを理解できません。パンダスの条件に基づいてNAを作成する

私はこのMWEに似パンダDF持っている:私が欲しいもの

In [92]: test_df = pd.DataFrame({'A': [1,2,3,4,5,6,7,8,9], 'B':[9,8,7,6,5,4,3,2,1]}) 

In [93]: test_df 
Out[93]: 
    A B 
0 1 9 
1 2 8 
2 3 7 
3 4 6 
4 5 5 
5 6 4 
6 7 3 
7 8 2 
8 9 1 

np.nanことが4未満であること、DFのすべての値を設定することです。私は、この基準についてブールのDFを取得することができます:

In [94]: test_df < 4 
Out[94]: 
     A  B 
0 True False 
1 True False 
2 True False 
3 False False 
4 False False 
5 False False 
6 False True 
7 False True 
8 False True 

しかし、私はそれらの真の値np.nanを作るための最後のステップを知りません。私はこれがtest_df.locで達成できると思ったが、私は自分の試みに成功しなかった。

答えて

3

のデフォルトTrue値による使用DataFrame.maskboolean maskNaNによって配置:

print (test_df.mask(test_df < 4)) 
    A B 
0 NaN 9.0 
1 NaN 8.0 
2 NaN 7.0 
3 4.0 6.0 
4 5.0 5.0 
5 6.0 4.0 
6 7.0 NaN 
7 8.0 NaN 
8 9.0 NaN 

別の解決策は、反転状態と簡単割り当てである:

test_df = test_df[test_df >= 4] 
print (test_df) 
    A B 
0 NaN 9.0 
1 NaN 8.0 
2 NaN 7.0 
3 4.0 6.0 
4 5.0 5.0 
5 6.0 4.0 
6 7.0 NaN 
7 8.0 NaN 
8 9.0 NaN 
3

あなたはboolean indexingを使用してNaNを割り当てることができます。

In [25]: test_df[test_df < 4] = np.nan 

In [26]: test_df 
Out[26]: 
    A B 
0 NaN 9.0 
1 NaN 8.0 
2 NaN 7.0 
3 4.0 6.0 
4 5.0 5.0 
5 6.0 4.0 
6 7.0 NaN 
7 8.0 NaN 
8 9.0 NaN 

条件を "否定" との代替ソリューション:

In [43]: test_df.where(test_df >= 4) 
Out[43]: 
    A B 
0 NaN 9.0 
1 NaN 8.0 
2 NaN 7.0 
3 4.0 6.0 
4 5.0 5.0 
5 6.0 4.0 
6 7.0 NaN 
7 8.0 NaN 
8 9.0 NaN 

か:

In [47]: test_df.where(~(test_df < 4)) 
Out[47]: 
    A B 
0 NaN 9.0 
1 NaN 8.0 
2 NaN 7.0 
3 4.0 6.0 
4 5.0 5.0 
5 6.0 4.0 
6 7.0 NaN 
7 8.0 NaN 
8 9.0 NaN 
関連する問題