可以说我有以下数据集:
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
编辑: 需要为浮点工作
答案 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.concatenate
与numpy.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.chain
和range
的替代解决方案:
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])