基于多个条件在python中为数据帧中的行创建父ID

基于多个条件在python中为数据帧中的行创建父ID,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个包含个人记录的大数据框架。我试图为在特定列上匹配的人创建一个父ID,以了解哪些记录实际上引用了同一个人 df = pd.DataFrame({'id':[1, 2, 3, 4, 5, 6, 7, 8], 'forename':['matt','mark','matthew','chris','rob','robert','john','mat'], 'surname': ['smith','smith','smi

我有一个包含个人记录的大数据框架。我试图为在特定列上匹配的人创建一个父ID,以了解哪些记录实际上引用了同一个人

df = pd.DataFrame({'id':[1, 2, 3, 4, 5, 6, 7, 8],
                   'forename':['matt','mark','matthew','chris','rob','robert','john','mat'],
                   'surname': ['smith','smith','smith','jones','quiton','quiton','rogers','smith'],
                   'phone': ['77881','77882','77881','66777','12299','93923','77881','37882'],
                   'email': ['email1@email.com','email2@email.com','email3@email.com','email4@email.com','email5@email.com','email5@email.com','email7@email.com','email1@email.com'],
                   'group': ['greggs','kikland','greggs group','dmrc','curve','tools','baron','greggs plan']})
我想根据
电话
电子邮件
列创建一个父ID,并创建一个记录匹配方式的注释

我正在尝试输出这样的数据帧,但运气不太好:

df = pd.DataFrame({'parent.id':[1,2,1,3,4,4,5,1,],
                   'matched': ['none','none','phone','none','email','email','none','email'],
                   'id':[1, 2, 3, 4, 5, 6, 7, 8],
                   'forename':['matt','mark','matthew','chris','rob','robert','john','mat'],
                   'surname': ['smith','smith','smith','jones','quiton','quiton','rogers','smith'],
                   'phone': ['77881','77882','77881','66777','12299','93923','77881','37882'],
                   'email': ['email1@email.com','email2@email.com','email3@email.com','email4@email.com','email5@email.com','email5@email.com','email7@email.com','email1@email.com'],
                   'group': ['greggs','kikland','greggs group','dmrc','curve','tools','baron','greggs plan']})
有人能帮忙吗?

我习惯于这样做。

我的诀窍是通过电子邮件分组,并获取组的最小id。他们都会被分配组的最小id作为可能的父id

然后我也会通过电话进行分组。

最后,我查看两个单独分组的结果,并通过获取找到的id的最小值来确定新的父id。

df['email_match'] = df.groupby('email')['id'].transform('min')
df['matched_by_email'] = df.groupby('email')['id'].transform('count') > 1

df['phone_match'] = df.groupby('phone')['id'].transform('min')
df['matched_by_phone'] = df.groupby('phone')['id'].transform('count') > 1

df['parent_id'] = df[['email_match', 'phone_match']].min(axis=1)

示例中的某些条目可以通过电话和电子邮件进行匹配。

根据您告诉我的内容,您可以创建一个新的df,不包括使用pandas方法复制电话或电子邮件的行。
duplicated()


你可以根据这个新的df创建你的新id

你尝试过什么,你正在努力解决什么?id 2也可以根据电话号码与id 8匹配,这是有意的吗?@SandervandenOord很抱歉,刚刚解决了这个问题。@FlavioMoraes我一直在尝试使用df.merge创建表,根据每列将其自身合并两次。我对python还比较陌生,还没有将它做成所需的形状。是否要合并电话和电子邮件?它们是字符串,您可以对它们求和:df['ṕarent_id']=df['phone']+df['email']
phone_dup = df['phone'].duplicated()
email_dup = df['email'].duplicated()

new_df = df[~phone_dup & ~email_dup]