如何按列识别ABAB模式并合并为AB以聚合Pandas DataFrame计数?
处理Pandas DataFrame中的ABAB模式合并求和
需求说明
识别DataFrame的letter列中连续的ABAB模式(如b,c,b,c),将其简化为AB并对对应位置的count求和;非ABAB模式的行保持原样。
示例输入:
import pandas as pd df = pd.DataFrame() df['letter'] = ['a','b','c','b','c', 'a', 'c', 'b'] df['count'] = [1, 6, 7 , 2 , 7, 1 , 3, 3 ] print(df)
输出:
letter count 0 a 1 1 b 6 2 c 7 3 b 2 4 c 7 5 a 1 6 c 3 7 b 3
目标输出:
letter count 0 a 1 1 b 8 2 c 14 3 a 1 4 c 3 5 b 3
实现步骤与代码
- 标记ABAB模式的起始位置
通过移位比较,判断哪些位置是ABAB模式的起点(即第i行开始的连续四行是ABAB):
# 构建条件:i行和i+2行相同,i+1行和i+3行相同,且i行≠i+1行 cond = (df['letter'] == df['letter'].shift(-2)) & \ (df['letter'].shift(-1) == df['letter'].shift(-3)) & \ (df['letter'] != df['letter'].shift(-1)) # 最后三行无法形成ABAB,设为False cond.iloc[-3:] = False
- 为行分配分组ID
给ABAB模式的四行分配两个组(对应A和B),非模式行各自为独立组:
# 初始化分组ID group_id = [] current_group = 0 i = 0 while i < len(df): if cond.iloc[i]: # ABAB模式:前两行与后两行分别对应同一组 group_id.extend([current_group, current_group+1, current_group, current_group+1]) current_group += 2 i += 4 # 跳过已处理的四行 else: group_id.append(current_group) current_group += 1 i += 1 df['group'] = group_id
- 按分组聚合求和
根据分组ID,对count求和,同时保留对应的letter:
# 聚合:每个组取第一个letter,对count求和 result = df.groupby('group').agg( letter=('letter', 'first'), count=('count', 'sum') ).reset_index(drop=True) print(result)
代码说明
- 标记条件通过移位操作精准识别ABAB模式,排除了AAAA、ABAC等不符合要求的序列;
- 分组ID的分配确保ABAB模式的四行被映射到两个组,实现合并求和的逻辑;
- 最后通过分组聚合完成数据简化,非模式行保持原有结构不变。
内容的提问来源于stack exchange,提问作者datasavvy
相关产品推荐
相关产品推荐

