<h3>解决方案1</h3>
<p>这会产生预期的结果,但执行时间与两个<code>for</code>循环相当或较慢。你知道吗</p>
<pre><code>df['remove'] = False
for i in df.index:
df['remove'].loc[(~df['remove']) & (df['qstart'] > df.loc[i, 'qstart']) & (df['qend'] < df.loc[i, 'qend'])] = True
ddf = df.loc[~df['remove']]
</code></pre>
<p>我首先添加一个名为<code>'remove'</code>的列,每个元素都设置为<code>False</code>,用于跟踪要删除的行。<br/>
索引上的循环根据您的条件更改为<code>True</code>列的元素<code>'remove'</code>。每一行都是这样。<br/>
然后您可以通过选择<code>'remove'</code>所在的所有行<code>False</code>来创建一个新的数据帧<code>ddf</code>。你知道吗</p>
<h3>解决方案2</h3>
<p>类似但更快的解决方案是循环行的组合:</p>
<pre><code>from itertools import combinations
df['remove'] = False
for i, j in combinations(df.index, 2):
if not df.loc[j, 'remove']:
df.loc[j, 'remove'] = df.loc[j, 'qstart'] > df.loc[i, 'qstart'] and df.loc[j, 'qend'] < df.loc[i, 'qend']
ddf = df.loc[~df['remove']])
</code></pre>
<p>在概念上类似,但在这里我们选择每一对一次,这加快了执行时间。解决方案1 <code>loc</code>每次选择检查整个数据帧,因此有很多无用的比较。<br/>
根据我的测试,这应该比两个<code>for</code>循环快。你知道吗</p>
<p>对于这两种解决方案,使用</p>
<pre><code>pd.options.mode.chained_assignment = None
</code></pre>
<p>提高执行时间。你知道吗</p>