如何在定义的数字范围之外搜索所有数据框行?

时间:2017-01-12 16:25:33

标签: python pandas dataframe

所以我有一个数据框,包含50列和400行,包含所有数字。我试图仅显示具有超出预定义范围的值的列(即仅显示不在-1到+3之间的值)。

到目前为止,我有:

df[(df.T > 3).all()]

显示大于2的值然后我可以将整数更改为其他感兴趣的数字,但我可以写一些东西来显示超出范围的数字(即显示值范围超出-1的所有列+3)。

2 个答案:

答案 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