我觉得这可能有一个简单的解决方案,我无法弄明白。
我有一个类似于这个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
来实现,但我在尝试中并不成功。
答案 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