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

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

代码逻辑说明

  1. 按id分组后,对每组的name列表按层级长度排序,确保短的顶级条目先被处理;
  2. 用集合记录已处理的条目,避免重复统计同一分支的内容;
  3. 对每个未处理的顶级条目,统计所有以它为前缀(含自身)的条目数量;
  4. 将该分支下所有条目标记为已处理,确保后续不会重复计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:55:21