如何提取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内置的向量化操作生成分组标识,避免手动循环索引,大幅提升性能:
生成分组ID
通过标记Level=1的行并累加,为每个连续的组分配唯一ID:df['group_id'] = (df['Level'] == 1).cumsum()拆分得到子DataFrame
按生成的group_id分组,将结果存入字典方便后续按Part名称处理:sub_dfs = {f"group_{g}": group.drop('group_id', axis=1) for g, group in df.groupby('group_id')}查看拆分结果
遍历字典即可获取每个子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
相关产品推荐
相关产品推荐

