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

如何基于placa_encoded和break=True拆分Pandas DataFrame分组

问题描述

我有一个名为merged的DataFrame,索引为placa_encoded,数据结构如下:

placa_encoded   codcet          break 

561.0           490101113       False
561.0           480481112       False
660.0           400081122       False
660.0           420121123       True
660.0           420141122       False
660.0           420151122       False
660.0           420171122       False
660.0           420171113       True
660.0           420161112       False
660.0           420151112       False
660.0           420121112       False
660.0           420111112       False
...

我希望将其处理为如下结构:按placa_encoded分组,每个placa_encoded组内,以break=True的行作为分隔点(首个组除外)拆分出子组:

placa_encoded   codcet          break 

[561.0] 
561.0           490101113       False
561.0           480481112       False

[660.0] 
660.0           400081122       False

660.0           420121123       True
660.0           420141122       False
660.0           420151122       False
660.0           420171122       False

660.0           420171113       True
660.0           420161112       False
660.0           420151112       False
660.0           420121112       False
660.0           420111112       False
...

我尝试了以下代码,但未达到预期效果——它把每个placa_encoded内的行按break的True/False连续值分组,而非我需要的拆分方式:

merged['ne'] = merged['break'].ne(merged['break'].shift()).cumsum()
merged.groupby(['placa_encoded', merged['ne']], sort=False)
解决方案

要实现需求,核心是在每个placa_encoded组内,用break=True的累计出现次数作为子组标识,具体代码如下:

步骤1:生成子组标识

按placa_encoded分组后,对break列做累计求和,每遇到一个break=True,累计值加1,后续行自动归入新的子组:

merged['subgroup'] = merged.groupby('placa_encoded')['break'].cumsum()

步骤2:按复合键分组

用placa_encoded和subgroup作为分组键,完成子组拆分:

grouped = merged.groupby(['placa_encoded', 'subgroup'], sort=False)

步骤3:输出带分组标题的格式(可选)

如果要输出成你展示的带分组标题的样式,可以遍历分组打印:

for (placa, subgroup), group_df in grouped:
    if subgroup == 0:
        print(f"\n[{placa}]")
    print(group_df)
    print()

逻辑对比

  • 你之前的代码用ne().cumsum()是按break的连续相同值分组,比如连续False为一组,遇到True就新建组,再遇到False又新建组,和需求逻辑不符。
  • 新方法的cumsum()会在每个break=True时递增子组编号:
    • break=True之前的行属于subgroup=0
    • 第一个break=True及其到下一个break=True之前的行属于subgroup=1
    • 第二个break=True及其之后的行属于subgroup=2,以此类推,完全匹配你要的拆分规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:20:04