交叉口2 pandas datafram

2024-10-03 23:29:57 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的问题中,我有两个数据帧mydataframe1和{},如下所示。

mydataframe1
Out[13]:
  Start   End       Remove     
  50      60        1  
  61      105       0  
  106     150       1  
  151     160       0  
  161     180       1  
  181     200       0  
  201     400       1  


mydataframe2
Out[14]: 
    Start   End  
    55      100
    105     140
    151     154
    155     185
    220     240    

mydataframe2我想删除间隔开始结束包含在"Remove"=1间隔中的任何"Remove"=1间隔中的行。换句话说,在mydataframe2的间隔和{}中的每个间隔之间不应该有任何itnersection

在这种情况下,mydataframe2变成

^{pr2}$

Tags: 数据间隔情况outstartremoveendpr2
3条回答

您可以使用pd.IntervalIndex作为交叉点

获取要删除的行

In [313]: dfr = df1.query('Remove == 1')

从要删除的范围构造IntervalIndex

^{pr2}$

构建待测试的IntervalIndex

In [315]: s2 = pd.IntervalIndex.from_arrays(df2.Start, df2.End, 'both')

选择不在s1范围内的s2行

In [316]: df2.loc[[x not in s1 for x in s2]]
Out[316]:
   Start  End
2    151  154

详细信息

In [320]: df1
Out[320]:
   Start  End  Remove
0     50   60       1
1     61  105       0
2    106  150       1
3    151  160       0
4    161  180       1
5    181  200       0
6    201  400       1

In [321]: df2
Out[321]:
   Start  End
0     55  100
1    105  140
2    151  154
3    155  185
4    220  240

In [322]: dfr
Out[322]:
   Start  End  Remove
0     50   60       1
2    106  150       1
4    161  180       1
6    201  400       1

IntervalIndex详细信息

In [323]: s1
Out[323]:
IntervalIndex([[50, 60], [106, 150], [161, 180], [201, 400]]
              closed='both',
              dtype='interval[int64]')

In [324]: s2
Out[324]:
IntervalIndex([[55, 100], [105, 140], [151, 154], [155, 185], [220, 240]]
              closed='both',
              dtype='interval[int64]')

In [326]: [x not in s1 for x in s2]
Out[326]: [False, False, True, False, False]

我认为这应该行得通:

mydataframe2[mydataframe2.Start.isin(mydataframe1[mydataframe1.Remove != 0].Start)]

分解:

^{pr2}$

我们可以使用Medial- or length-oriented tree: Overlap test

In [143]: d1 = d1.assign(s=d1.Start+d1.End, d=d1.End-d1.Start)

In [144]: d2 = d2.assign(s=d2.Start+d2.End, d=d2.End-d2.Start)

In [145]: d1
Out[145]:
   Start  End  Remove    d    s
0     50   60       1   10  110
1     61  105       0   44  166
2    106  150       1   44  256
3    151  160       0    9  311
4    161  180       1   19  341
5    181  200       0   19  381
6    201  400       1  199  601

In [146]: d2
Out[146]:
   Start  End   d    s
0     55  100  45  155
1    105  140  35  245
2    151  154   3  305
3    155  185  30  340
4    220  240  20  460

现在我们可以检查重叠间隔和过滤:

^{pr2}$

相关问题 更多 >