如何过滤掉pandas数据框中特定列的第1和第3四分位数内的行?

时间:2016-04-20 04:08:23

标签: python python-2.7 pandas dataframe

我正在使用python中的数据框如何过滤所有具有特定列值的行,例如val,它们属于第1和第3四分位数。

谢谢。

3 个答案:

答案 0 :(得分:5)

low, high = df.B.quantile([0.25,0.75])
df.query('{low}<B<{high}'.format(low=low,high=high))

答案 1 :(得分:2)

让我们创建一些包含100行和3列的随机数据:

import numpy as np
import pandas as pd

np.random.seed(0)

df = pd.DataFrame(np.random.randn(100, 3), columns=list('ABC'))

现在让我们使用loc过滤掉其顶部和底部四分位(保留中间)上方和下方的B列中的所有数据。

lower_quantile, upper_quantile = df.B.quantile([.25, .75])

>>> df.loc[(df.B > lower_quantile) & (df.B < upper_quantile)].head()
           A         B         C
0   1.764052  0.400157  0.978738
2   0.950088 -0.151357 -0.103219
3   0.410599  0.144044  1.454274
4   0.761038  0.121675  0.443863
10  0.154947  0.378163 -0.887786

答案 2 :(得分:2)

使用pd.Series.between()并解包quantile生成的df.A.quantile([lower, upper])值,您可以过滤DataFrame,此处使用0-100范围内的示例数据进行说明:

import numpy as np
import pandas as pd

df = pd.DataFrame(data={'A': np.random.randint(0, 100, 10), 'B': np.arange(10)})

    A  B
0   4  0
1  21  1
2  96  2
3  50  3
4  82  4
5  24  5
6  93  6
7  16  7
8  14  8
9  40  9

df[df.A.between(*df.A.quantile([0.25, 0.75]).tolist())]


    A  B
1  21  1
3  50  3
5  24  5
9  40  9

关于绩效:.query()减慢了2倍的速度:

df = DataFrame(data={'A': np.random.randint(0, 100, 1000), 'B': np.arange(1000)})

def query(df):
    low, high = df.B.quantile([0.25,0.75])
    df.query('{low}<B<{high}'.format(low=low,high=high))

%timeit query(df)
1000 loops, best of 3: 1.81 ms per loop

def between(df):
    df[df.A.between(*df.A.quantile([0.25, 0.75]).tolist())]

%timeit between(df)
1000 loops, best of 3: 995 µs per loop

@ Alexander的解决方案与使用.between()的解决方案完全相同。