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

如何对Pandas DataFrame按A、B列连续相同值分组?

按A和B列连续相同值分组Pandas DataFrame

首先是你的原始DataFrame:

import pandas as pd

df = pd.DataFrame({
   'A': [1,1,1,1,2,2,2,1,1,3,3,3],
   'B': [0,0,1,1,0,0,0,1,1,0,0,0],
});
df.index.names = ['Index']

输出结果:

A   B
Index       
0       1   0
1       1   0
2       1   1
3       1   1
4       2   0
5       2   0
6       2   0
7       1   1
8       1   1
9       3   0
10      3   0
11      3   0

你之前用下面的代码按A列连续相同值分组:

df = df.groupby(df['A'].diff().ne(0).cumsum()).apply(lambda x: x)
df.index.names = ['Block', 'Index']

得到的结果:

A   B
Block   Index       
1       0       1   0
        1       1   0
        2       1   1
        3       1   1
2       4       2   0
        5       2   0
        6       2   0
3       7       1   1
        8       1   1
4       9       3   0
        10      3   0
        11      3   0

要实现按A和B列的连续相同值分组,只需要把判断逻辑改成同时检查A和B两列是否发生变化。具体代码如下:

# 生成按A、B连续相同值的分组标识
group_key = df[['A', 'B']].diff().any(axis=1).cumsum()
# 分组并保留原索引
df_grouped = df.groupby(group_key).apply(lambda x: x)
# 设置多级索引名称
df_grouped.index.names = ['Block', 'Index']

执行后得到的结果就是你期望的:

A   B
Block   Index       
1       0       1   0
        1       1   0
2       2       1   1
        3       1   1
3       4       2   0
        5       2   0
        6       2   0
4       7       1   1
        8       1   1
5       9       3   0
        10      3   0
        11      3   0

简单说明

df[['A','B']].diff()会计算每列前后行的差值(非数值类型也能判断是否变化);any(axis=1)表示只要A或B列有一行和上一行不同,就返回True;cumsum()会把这些True(视为1)累加,生成连续的分组编号,这样就能把A和B都相同的连续行分到同一个Block里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:23:24