根据Pandas DF中的条件设置NA

时间:2017-01-30 18:24:22

标签: python pandas nan

我觉得这可能有一个简单的解决方案,我无法弄明白。

我有一个类似于这个MWE的Pandas 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

我想要的是将该df中小于4的所有值设置为np.nan。我可以根据这个标准得到一个布尔的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来实现,但我在尝试中并不成功。

2 个答案:

答案 0 :(得分: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

替代解决方案&#34;否定&#34;条件:

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

答案 1 :(得分:3)

使用DataFrame.mask,默认True boolean mask的值将替换为NaN

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