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

