擅长:python、mysql、java
<p>遵循您的逻辑,仅使用矢量化方法来保持代码的效率,我们可以执行以下操作:</p>
<pre><code>mask_yes = df['match'].eq('yes') # array with True for rows with 'yes'
mask_no = df['match'].eq('no') # array with True for rows with 'no'
# if the row is 'yes', get the shifted id, else the original id
df['id'] = np.where(mask_yes, df['id'].shift(), df['id'])
# if a group has 'no' mark all rows as True so we can keep the whole group
mask = df.assign(indicator=mask_no).groupby('gp')['indicator'].transform('any')
# filter on groups with 'no' or only the row 'yes'
df = df[mask | mask_yes]
</code></pre>
<pre><code> id gp meta matchvar match
1 1.0 a two w ww w yes
2 3.0 b three xxxx NaN
3 4.0 b four xyxx no
</code></pre>