过滤具有多个条件的pandas数据帧

时间:2017-10-02 22:05:25

标签: python pandas

我有两个dataframes.first one就是这样的

section,position
1,13
1,17
1,25
2,10
2,15
3,6
3,12
3,19

,第二个是

section,position_start,position_end
1,10,14
2,2,9
2,15,16
3,18,50

我的目标是使用第二个数据帧过滤第一个数据帧。我正在尝试获取位于position_start和position_end之间的位置,同时还要考虑各个部分。

由于

以下是考虑部分的预期输出:

section,position
1,13
2,15
3,19

2 个答案:

答案 0 :(得分:3)

设置

idx = pd.IntervalIndex.from_arrays(df2['position_start'], df2['position_end'], closed='both')
df2=df2.set_index(idx)

溶液

Mask=df1.apply(lambda x :[x['position'] in y for y in df2.loc[df2.section==x.section,].index],axis=1)
Mask=Mask.apply(lambda x :sum(x))>0
df1[Mask]

Out[121]: 
   section  position
0        1        13
4        2        15
7        3        19

答案 1 :(得分:2)

使用pd.IntervalIndex + get_indexer_non_unique

idx = pd.IntervalIndex.from_arrays(df2.position_start, \
                                  df2.position_end, closed='left')    
print(idx)
IntervalIndex([[10, 14), [2, 9), [15, 16), [18, 50)]
              closed='left',
              dtype='interval[int64]')

mask = idx.get_indexer_non_unique(df.position)[0] >= 0
print(mask)
array([ True, False,  True,  True,  True,  True,  True,  True], dtype=bool)
print(df[mask])
   section  position
0        1        13
2        1        25
3        2        10
4        2        15
5        3         6
6        3        12
7        3        19