删除互斥记录

2024-09-27 00:22:34 发布

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

删除记录集中互斥记录的最快方法是什么。 我正在使用Python,如果需要,可以利用Pandas

我有以下资料:

^{tb1}$

例如,我们看到,记录1被共享给用户A,然后从用户A中删除,然后再次共享,然后删除,因此不应该存在任何记录

输出应仅为一行:

^{tb2}$

一种选择是使用字典,如果记录中存在互不相容的记录,则删除该记录,这些记录具有密钥和共享类型。键可能类似于[recordId]-[shareType]-[sharedToUser]

我在想,也许在某些地方(熊猫?)已经存在类似的功能


Tags: 方法用户利用类型pandas字典地方记录
2条回答

您可以执行以下操作-

  1. 定义一个新列state,该列在shared时等于1,在share_removed时等于-1
  2. Groupby RecordID和UserID,并对这个新变量求和。
    • 如果用户的访问权限被删除,则总和将为0(如果多次删除,则总和将小于0)
    • 如果用户的访问权限仍然存在,则总和将为1或以上(如果共享多次)
  3. 根据此条件创建一个新列,然后使用该列最终筛选数据帧。如有必要,请删除“条件”列
#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)

enter image description here


备选方案:

如果您愿意使用numpy.where,这会使它更干净,因为这样您就可以使用df.assign,而无需显式地为groupby创建新列-

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]

enter image description here

那怎么办

>>> d = df.set_index('Record ID')
>>> d[(d.groupby(by='Record ID')['Share type'].count() % 2).astype(bool)]
            Shared On Share type Share To User
Record ID                                     
4          1611872855     shared        user C

只有当两个可能的共享类型事件,即'share''share_removed'强制像开关一样相互排斥时,这种方法才有效

否则,如果出于某种原因,没有报告'shared''share_removed'事件,那么我的方法就没有@Akshay的方法那么健壮

相关问题 更多 >

    热门问题