使用Pandas合并重复联系人行:唯一值以&拼接的实现问题
解决方案:Pandas 合并重复联系人数据并生成邮件列表CSV
核心思路
- 确定分组依据:以联系人的唯一标识字段(
Last Name、Contact First Name、Contact Last Name、Email)作为分组键,确保只有属于同一联系人的行才会被合并。 - 自定义聚合逻辑:对需要合并的字段(
First Name、Preferred Name、Type、ID),如果组内所有值相同则直接保留原值;如果存在不同值,则用&拼接唯一值(自动去重,避免重复内容)。
完整代码实现
import pandas as pd # 1. 加载/创建原始数据(替换为你的XLS文件路径:pd.read_excel("your_exported_data.xls")) data = [ ["TMart", "Bob", "Bob", "TypeA", 22, "Sully", "TMart", "sullyt@email.com"], ["TMart", "Jannet", "Jan", "TypeB", 23, "Sully", "TMart", "sullyt@email.com"], # 新增Type相同的测试用例,验证不重复拼接逻辑 ["Smith", "Alice", "Ali", "TypeC", 45, "John", "Smith", "johns@email.com"], ["Smith", "Anna", "Annie", "TypeC", 46, "John", "Smith", "johns@email.com"] ] df = pd.DataFrame( data, columns=["Last Name", "First Name", "Preferred Name", "Type", "ID", "Contact First Name", "Contact Last Name", "Email"] ) # 2. 定义自定义聚合函数 def aggregate_unique_values(series): unique_vals = series.unique() if len(unique_vals) == 1: return unique_vals[0] # 对数字类型字段自动转字符串后拼接 return " & ".join(map(str, unique_vals)) # 3. 执行分组聚合 group_keys = ["Last Name", "Contact First Name", "Contact Last Name", "Email"] agg_config = { "First Name": aggregate_unique_values, "Preferred Name": aggregate_unique_values, "Type": aggregate_unique_values, "ID": aggregate_unique_values } merged_df = df.groupby(group_keys, as_index=False).agg(agg_config) # 4. 生成三个邮件列表CSV(示例按Type拆分,可根据实际需求调整筛选逻辑) # 假设三个列表对应TypeA、TypeB、TypeC for list_type in ["TypeA", "TypeB", "TypeC"]: # 筛选对应类型的联系人 list_df = merged_df[merged_df["Type"].str.contains(list_type)] # 保存为CSV(不含索引列) list_df.to_csv(f"mailing_list_{list_type}.csv", index=False)
关键细节说明
- 解决多列合并问题:使用
agg()方法可以针对不同列单独配置聚合逻辑,避免了单列apply()无法批量处理的问题。 - 自动处理值重复场景:自定义函数会先判断组内值是否唯一,相同值直接保留,无需多余拼接。
- 兼容数字类型字段:通过
map(str, unique_vals)将ID等数字类型转为字符串,确保拼接格式统一。
内容的提问来源于stack exchange,提问作者Josiah Stewart
相关产品推荐
相关产品推荐

