我正在使用python中的数据框如何过滤所有具有特定列值的行,例如val,它们属于第1和第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()
的解决方案完全相同。