<p>您可以执行以下操作-</p>
<ol>
<li>定义一个新列<code>state</code>,该列在<code>shared</code>时等于1,在<code>share_removed</code>时等于-1</li>
<li>Groupby RecordID和UserID,并对这个新变量求和。
<ul>
<li>如果用户的访问权限被删除,则总和将为0(如果多次删除,则总和将小于0)</li>
<li>如果用户的访问权限仍然存在,则总和将为1或以上(如果共享多次)</li>
</ul>
</li>
<li>根据此条件创建一个新列,然后使用该列最终筛选数据帧。如有必要,请删除“条件”列</li>
</ol>
<pre><code>#Check state of access as 1 or -1
df['state'] = df['Share type'].apply(lambda x: 1 if x=='shared' else -1)
#Groupby and filter for rows with state >=1
df[df.groupby(['Record ID', 'Share To User'])['state'].transform(sum)>=1].drop('state', axis=1)
</code></pre>
<p><a href="https://i.stack.imgur.com/mc0Io.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/mc0Io.png" alt="enter image description here"/></a></p>
<hr/>
<p><strong>备选方案:</strong></p>
<p>如果您愿意使用<code>numpy.where</code>,这会使它更干净,因为这样您就可以使用<code>df.assign</code>,而无需显式地为groupby创建新列-</p>
<pre><code>cond = df.assign(state = lambda x: np.where(x['Share type']=='shared', 1, -1))\
.groupby(['Record ID','Share To User'])['state']\
.transform(sum)>=1
df[cond]
</code></pre>
<p><a href="https://i.stack.imgur.com/mc0Io.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/mc0Io.png" alt="enter image description here"/></a></p>