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

如何提取DataFrame中Level=1起始至下一个Level=1前的行组

高效拆分DataFrame为Level=1开头的子数据集

需要将DataFrame按Level=1的行拆分,每个子DataFrame包含从某一行Level=1开始,到下一行Level=1出现前的所有行。之前通过遍历Level=1的索引区间提取行的方法,在数据包含约50个系统时性能不佳,现提供更高效的实现方式。

示例数据

import pandas as pd

df = pd.DataFrame({
    'Name': ["A","A","A","ABC","ABC","AAB","AAB","AAB"],
    'Level': [1,1,2,1,3,1,4,2],
    'Part': ["Upper System","Upper 2 System","Upper 2 stock","Upper System","Middle","Limits System", "Deck", "Ceiling"]
})

原DataFrame:

Name  Level             Part
0     A      1      Upper System
1     A      1  Upper 2 System
2     A      2  Upper 2 stock
3   ABC      1      Upper System
4   ABC      3           Middle
5   AAB      1    Limits System
6   AAB      4             Deck
7   AAB      2          Ceiling

高效分组实现

利用Pandas内置的向量化操作生成分组标识,避免手动循环索引,大幅提升性能:

  1. 生成分组ID
    通过标记Level=1的行并累加,为每个连续的组分配唯一ID:

    df['group_id'] = (df['Level'] == 1).cumsum()
    
  2. 拆分得到子DataFrame
    按生成的group_id分组,将结果存入字典方便后续按Part名称处理:

    sub_dfs = {f"group_{g}": group.drop('group_id', axis=1) for g, group in df.groupby('group_id')}
    
  3. 查看拆分结果
    遍历字典即可获取每个子DataFrame,例如:

    # 输出第一个子DataFrame
    print(sub_dfs['group_1'])
    # 输出第二个子DataFrame
    print(sub_dfs['group_2'])
    

拆分后的子DataFrame示例:

Name  Level         Part
0     A      1  Upper System
Name  Level             Part
1     A      1  Upper 2 System
2     A      2  Upper 2 stock
Name  Level         Part
3   ABC      1  Upper System
4   ABC      3       Middle
Name  Level           Part
5   AAB      1  Limits System
6   AAB      4           Deck
7   AAB      2        Ceiling

性能优势

该方法基于Pandas优化过的底层向量化操作,无需手动遍历索引区间,即使处理包含数百个分组的数据集,性能也远优于原方法,50个系统规模的数据可瞬时完成拆分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:33:19