如何在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
相关产品推荐
相关产品推荐

