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

如何在Pandas中为Primary Name拼接对应AKA类姓氏至新列?

解决Pandas中Primary Name对应AKA类姓氏拼接问题

现有如下Pandas DataFrame:

import pandas as pd

data = {'ID': [1071.0, 1072.0, nan, 1074.0, 1076.0, nan, nan, nan, 1077.0], 
'Name Type': ['Primary Name', 'Primary Name', 'Also Known As', 'Primary Name', 'Primary Name', 'Low Quality AKA', 'Low Quality AKA', 'Low Quality AKA', 'Primary Name'], 
'Surname': ['Brown', 'Red', 'R', 'Green', 'Purple', 'Pipi', 'Poopa', 'Peep', 'Orange']}
df = pd.DataFrame(data)

该DataFrame中还存在其他仅Primary Name行有数据、AKA类行无数据的列。需求是将每个Primary Name对应的Also Known As和Low Quality AKA类型的Surname值拼接,得到目标DataFrame。


处理方案

核心思路

先为每个Primary Name及其后续的AKA行创建分组标识,再通过分组聚合保留Primary Name的完整数据,同时拼接对应AKA的姓氏。

代码实现

# 1. 生成分组ID:每遇到Primary Name,分组ID递增
df['group_id'] = df['Name Type'].eq('Primary Name').cumsum()

# 2. 定义分组聚合逻辑
def process_group(group):
    # 提取当前组的Primary Name行数据(仅该行有完整非空值)
    primary_row = group[group['Name Type'] == 'Primary Name'].iloc[0]
    # 收集组内所有AKA类型的姓氏
    aka_surnames = group[group['Name Type'].str.contains('AKA')]['Surname'].tolist()
    # 拼接AKA姓氏,无则设为None
    primary_row['AKA_Surnames'] = ', '.join(aka_surnames) if aka_surnames else None
    # 移除不需要的临时列
    return primary_row.drop(['Name Type', 'group_id'])

# 3. 执行分组聚合并整理结果
result_df = df.groupby('group_id').apply(process_group).reset_index(drop=True)

print(result_df)

输出结果

ID Surname AKA_Surnames
0  1071.0   Brown         None
1  1072.0     Red            R
2  1074.0   Green         None
3  1076.0  Purple  Pipi, Poopa, Peep
4  1077.0  Orange         None

说明

  • 分组标识通过eq('Primary Name').cumsum()实现,确保每个Primary Name和其后续AKA行属于同一组;
  • 聚合时直接取分组内的Primary Name行数据,保证其他仅该行有值的列被完整保留;
  • AKA姓氏的分隔符可根据需求修改(如分号、空格等),无AKA时自动设为None。

内容的提问来源于stack exchange,提问作者nzskra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:38:15