Pandas如何精确匹配过滤并按组拼接字段生成To/CC新列
Pandas 分组匹配拼接邮箱实现方案
问题修正点
你之前使用的str.contains()是子串模糊匹配,只要字段文本包含目标字符串就会被命中,因此会将Tech Sales - Primary这类包含目标片段但并非完全相等的行误判。要做精确匹配直接使用等值判断== 'Sales - Primary'即可。
实现步骤
- 按
acc_id字段分组,分别计算每个分组下的两类邮箱集合:- To列:组内
TeamMemRole精确等于Sales - Primary的所有邮箱,用逗号拼接 - CC列:组内其余所有角色对应的邮箱,用逗号拼接
- To列:组内
- 将分组计算得到的邮箱映射合并回原DataFrame
- 仅保留每个
acc_id分组第一行的To、CC值,其余行置空,和你给出的预期效果对齐
完整实现代码
import pandas as pd # 按acc_id分组,计算每个组的To、CC邮箱串 def agg_group_mail(group_df): to_mails = group_df.loc[group_df['TeamMemRole'] == 'Sales - Primary', 'email'] cc_mails = group_df.loc[group_df['TeamMemRole'] != 'Sales - Primary', 'email'] return pd.Series({ 'To': ','.join(to_mails), 'CC': ','.join(cc_mails) }) # 生成分组邮箱映射表 mail_mapping = df.groupby('acc_id').apply(agg_group_mail).reset_index() # 将映射结果合并回原DataFrame df = df.merge(mail_mapping, on='acc_id', how='left') # 每个acc_id分组仅第一行保留To、CC值,其余行清空 df.loc[df.duplicated(subset='acc_id', keep='first'), ['To', 'CC']] = ''
运行代码后得到的结果和预期完全一致,不会出现角色误匹配的问题。
内容的提问来源于stack exchange,提问作者user13024918
相关产品推荐
相关产品推荐

