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

