所以我有一个数据框,包含50列和400行,包含所有数字。我试图仅显示具有超出预定义范围的值的列(即仅显示不在-1到+3之间的值)。
到目前为止,我有:
df[(df.T > 3).all()]
显示大于2的值然后我可以将整数更改为其他感兴趣的数字,但我可以写一些东西来显示超出范围的数字(即显示值范围超出-1的所有列+3)。
答案 0 :(得分:4)
您可以使用pd.DataFrame.mask
np.random.seed([3,1415])
df = pd.DataFrame(np.random.randint(-2, 4, (5, 3)), columns=list('abc'))
print(df)
a b c
0 -2 1 0
1 1 0 0
2 3 1 3
3 0 1 -2
4 0 -2 -2
掩码使得评估为True
NaN
df.mask(df.ge(3) | df.le(-1))
a b c
0 NaN 1.0 0.0
1 1.0 0.0 0.0
2 NaN 1.0 NaN
3 0.0 1.0 NaN
4 0.0 NaN NaN
或相反的
df.mask(df.lt(3) & df.gt(-1))
a b c
0 -2.0 NaN NaN
1 NaN NaN NaN
2 3.0 NaN 3.0
3 NaN NaN -2.0
4 NaN -2.0 -2.0
答案 1 :(得分:1)
您可以调用stack
来堆叠所有列,以便您可以使用between
生成范围上的掩码,然后使用~
反转掩码,然后调用dropna(axis=1)
}:
In [193]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
df
Out[193]:
a b c
0 0.088639 0.275458 0.837952
1 1.395237 -0.582110 0.614160
2 -1.114384 -2.774358 2.119473
3 1.050008 -1.195167 -0.343875
4 -0.006156 -2.028601 -0.071448
In [198]:
df[~df.stack().between(0.1,1).unstack()].dropna(axis=1)
Out[198]:
a
0 0.088639
1 1.395237
2 -1.114384
3 1.050008
4 -0.006156
所以这里只有专栏' a'值不在0.1和1之间
在dropna
之前,您可以看到其他列不符合此条件,因此生成NaN
:
In [199]:
df[~df.stack().between(0.1,1).unstack()]
Out[199]:
a b c
0 0.088639 NaN NaN
1 1.395237 -0.582110 NaN
2 -1.114384 -2.774358 2.119473
3 1.050008 -1.195167 -0.343875
4 -0.006156 -2.028601 -0.071448
默认情况下会包含左右值,如果不是这样,则将inclusive=False
传递给between