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

如何按列识别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

实现步骤与代码

  1. 标记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
  1. 为行分配分组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
  1. 按分组聚合求和
    根据分组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:10:29