繁体   English   中英

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

[英]Create parent ids for rows in a dataframe in python based on multiple conditions

我有一个包含个人记录的大数据框。 我正在尝试为在特定列上匹配的人创建一个父 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']})

我想根据phoneemail列创建一个父 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']})

有人可以帮忙吗?

我正在使用.groupby().transform()来解决这个问题。

我的诀窍是按电子邮件分组并取组的最小 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()的电话或电子邮件重复的行duplicated()

phone_dup = df['phone'].duplicated()
email_dup = df['email'].duplicated()

new_df = df[~phone_dup & ~email_dup]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM