[英]Python add / merge rows of a dataframe together based on multiple conditions
[英]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']})
我想根据phone
和email
列创建一个父 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.