You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:48:21