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

