如何在PyDataTable中按姓名合并重复观测并聚合SSN字段?
PyDataTable按姓名分组合并去重SSN字段
原始数据
首先定义题目中的PyDataTable数据框:
import datatable as dt my_dt = dt.Frame({ 'last_name': ['mallesh', 'bhavik', 'jagarini', 'mallesh', 'jagarini'], 'first_name': ['yamulla', 'vemulla', 'yegurla', 'yamulla', 'yegurla'], 'ssn': ['1234', '7847', '0648', '4567', '0648'] })
解决方案
我们需要按last_name和first_name分组,对每组的ssn去重后用分号;拼接,这里提供两种实现方式:
方式一:自定义聚合函数
通过自定义函数实现去重+拼接逻辑,再结合分组聚合完成需求:
# 定义聚合函数:保留原始顺序去重后拼接 def combine_unique_ssn(ssn_series): # 用dict.fromkeys去重并保留元素原始出现顺序 unique_ssns = list(dict.fromkeys(ssn_series.to_list())) return ';'.join(unique_ssns) # 分组聚合并重命名结果列 result_dt = my_dt[:, dt.combine(combine_unique_ssn, dt.f.ssn), dt.by('last_name', 'first_name')] result_dt.names = {'ssn': 'combined_ssn'} # 输出结果 print(result_dt)
方式二:使用内置unique函数
先通过分组取唯一值得到SSN列表,再将列表转换为拼接字符串:
result_dt = (my_dt # 分组后提取每组的唯一SSN .groupby(['last_name', 'first_name']) .agg([dt.unique(dt.f.ssn)]) # 将SSN列表转成分号连接的字符串 [:, dt.update(combined_ssn=dt.f.ssn.apply(lambda x: ';'.join(x)))] # 保留需要的列 [:, ['last_name', 'first_name', 'combined_ssn']] ) # 输出结果 print(result_dt)
预期输出
两种方式都会得到如下结果:
last_name first_name combined_ssn 0: mallesh yamulla 1234;4567 1: bhavik vemulla 7847 2: jagarini yegurla 0648
内容的提问来源于stack exchange,提问作者myamulla_ciencia
相关产品推荐
相关产品推荐

