如何在Pandas中按列分组提取公共顶级字符串并统计子项数量
按ID分组提取公共顶级字符串并统计数量
给定如下结构的DataFrame:
id name 1 AA-BB-CC-DD 1 AA-BB-CC 1 AA-BB-CC-DD-EE 1 AA-BB-UU-VV 1 AA-BB-UU 1 FF-MM-NN 1 FF-MM-NN-PP 2 XX-YY 2 XX-ZZ 2 XX-ZZ-AA
需要按id分组,提取每组中name列的公共顶级字符串(即该字符串是组内多个name的前缀节点,且是该分支的最顶层完整条目),并统计每个顶级字符串对应的下级(含自身)条目数量,期望输出如下:
id name count 1 AA-BB-CC 3 1 AA-BB-UU 2 1 FF-MM-NN 2 2 XX-YY 1 2 XX-ZZ 2
解决方案(Python + Pandas)
import pandas as pd # 构造示例数据 data = { 'id': [1,1,1,1,1,1,1,2,2,2], 'name': ['AA-BB-CC-DD', 'AA-BB-CC', 'AA-BB-CC-DD-EE', 'AA-BB-UU-VV', 'AA-BB-UU', 'FF-MM-NN', 'FF-MM-NN-PP', 'XX-YY', 'XX-ZZ', 'XX-ZZ-AA'] } df = pd.DataFrame(data) def process_group(group): names = group['name'].tolist() # 按拆分后的层级数排序,短的顶级条目优先处理 names_sorted = sorted(names, key=lambda x: len(x.split('-'))) processed = set() result = [] for name in names_sorted: if name in processed: continue # 统计当前顶级条目覆盖的所有条目数(含自身) count = sum(1 for n in names if n == name or n.startswith(f"{name}-")) result.append({'id': group['id'].iloc[0], 'name': name, 'count': count}) # 将该分支下所有条目标记为已处理,避免重复统计 processed.update(n for n in names if n == name or n.startswith(f"{name}-")) return pd.DataFrame(result) # 分组处理并生成结果 result_df = df.groupby('id', group_keys=False).apply(process_group).reset_index(drop=True) print(result_df)
代码逻辑说明
- 按
id分组后,对每组的name列表按层级长度排序,确保短的顶级条目先被处理; - 用集合记录已处理的条目,避免重复统计同一分支的内容;
- 对每个未处理的顶级条目,统计所有以它为前缀(含自身)的条目数量;
- 将该分支下所有条目标记为已处理,确保后续不会重复计算。
内容的提问来源于stack exchange,提问作者Nadiia
相关产品推荐
相关产品推荐

