从数据框熊猫中提取多个范围

时间:2018-07-17 00:04:42

标签: python pandas numpy dataframe

可以说我有以下数据集:

A      B    
10.1   53
12.5   42
16.0   37
20.7   03
25.6   16
30.1   01
40.9   19
60.5   99  

我有以下范围列表。

[[9,15],[19,22],[39,50]]  

如何有效地拉出那些范围内的行?

想要的输出

A      B    
10.1   53
12.5   42
20.7   03
40.9   19

编辑: 需要为浮点工作

2 个答案:

答案 0 :(得分:1)

更新已修改的问题

对于浮点数,您可以使用NumPy数组操作构造遮罩:

L = np.array([[9,15],[19,22],[39,50]])
A = df['A'].values

mask = ((A >= L[:, 0][:, None]) & (A <= L[:, 1][:, None])).any(0)

res = df[mask]

print(res)

      A   B
0  10.1  53
1  12.5  42
3  20.7   3
6  40.9  19

原始问题的先前答案

对于整数,可以将numpy.concatenatenumpy.arange一起使用:

L = [[9,15],[19,22],[39,50]]

vals = np.concatenate([np.arange(i, j) for i, j in L])

res = df[df['A'].isin(vals)]

print(res)

    A   B
0  10  53
1  12  42
3  20   3
6  40  19

使用itertools.chainrange的替代解决方案:

from itertools import chain

vals = set(chain.from_iterable(range(i, j) for i, j in L))

res = df[df['A'].isin(vals)]

答案 1 :(得分:0)

这是另一种方法(编辑:适用于浮点数或整数)。 @jpp的速度可能更快,但是(我认为)此代码更易于理解。

df = pd.DataFrame([[10.1,53],[12.5,42],[16.0,37],[20.7,3],[25.6,16],[30.1,1],[40.9,19],[60.5,99]],columns=list('AB'))
ranges = [[9,15],[19,22],[39,50]]  

result = pd.DataFrame(columns=list('AB'))
for r in ranges:
    result = result.append(df[df['A'].between(r[0], r[1], inclusive=False)])

print (result)

以下是输出:

      A   B
0  10.1  53
1  12.5  42
3  20.7   3
6  40.9  19

PS:以下单行列表理解也可以:

result = result.append([source[source['A'].between(r[0], r[1], inclusive=False)] for r in ranges])