我有两个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
答案 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