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

如何通过GroupBy统计DataFrame分组内行的重叠子字符串数量?

按Project分组统计相邻行Members子字符串重叠数的实现方法

核心思路

先把Members列的字符串转换为集合(方便快速计算交集),再按Project分组,对每组内的相邻行计算集合交集的长度,就是重叠的子字符串数量。

代码实现

1. 导入依赖并构造示例数据

import pandas as pd

# 模拟你的DataFrame结构
df = pd.DataFrame({
    'Project': ['Project_A', 'Project_A', 'Project_A', 'Project_B', 'Project_B'],
    'Members': ['Alice,Bob,Charlie', 'Bob,Charlie,Dave', 'Charlie,Dave,Eve', 'Frank,Grace', 'Grace,Heidi']
})

2. 定义分组处理函数

def calculate_overlap(group):
    # 将逗号分隔的Members字符串转为集合
    group['members_set'] = group['Members'].str.split(',').apply(set)
    # 计算当前行与下一行的集合交集长度
    group['Overlap_Count'] = group['members_set'].shift(-1).apply(
        lambda x: len(group['members_set'] & x) if pd.notna(x) else None
    )
    # 删除中间辅助列
    return group.drop('members_set', axis=1)

3. 分组应用函数并获取结果

result = df.groupby('Project', group_keys=False).apply(calculate_overlap)
print(result)

结果说明

运行后会得到新增Overlap_Count列的DataFrame,其中:

  • Project_A的第一行与第二行重叠数为2(Bob、Charlie),第二行与第三行重叠数为2(Charlie、Dave)
  • Project_B的第一行与第二行重叠数为1(Grace)
  • 每组最后一行无后续行,Overlap_Count为None

为什么之前转列表对比没成功?

如果直接用列表遍历对比,需要手动循环相邻行逐个元素匹配,不仅代码繁琐,效率也低,而且容易忽略重复元素的情况(如果Members里有重复子串)。用集合的交集操作会自动去重,且计算交集长度更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 16:03:10