如何在Pandas DataFrame中提取分组标题及对应数据生成独立DataFrame
拆分分组式Pandas DataFrame为独立子DataFrame
针对你提到的Excel导出的特殊格式DataFrame(分组标题+不定行数数据+空行分隔),可以按以下步骤拆分每个分组为独立的DataFrame:
步骤1:清理数据,移除空行
首先删除全为空的分隔行,避免干扰分组识别:
import pandas as pd # 读取Excel文件 df = pd.read_excel('your_file.xlsx') # 删除所有列都为空的行 df = df.dropna(how='all').reset_index(drop=True)
步骤2:标记分组标题行
根据你的需求,分组标题名称是固定的,可直接通过名称匹配标记标题行;如果标题行是通过Excel加粗格式区分的,可通过读取单元格格式识别:
方式A:通过固定标题名称标记
# 定义所有分组标题的列表 group_headers = ['First Group Header', 'Second Group Header', 'Third Group Header'] # 标记每行是否为标题行 df['is_header'] = df['Name'].isin(group_headers)
方式B:通过Excel加粗格式标记
如果标题行是靠字体加粗区分的,需要借助openpyxl读取单元格格式:
from openpyxl import load_workbook wb = load_workbook('your_file.xlsx') ws = wb.active # 遍历数据行(跳过表头行),检查Name列单元格是否加粗 is_header = [] for row in ws.iter_rows(min_row=2, max_row=ws.max_row): name_cell = row[0] # Name列对应Excel的第一列 is_header.append(name_cell.font.bold) # 将标记结果加入DataFrame df['is_header'] = is_header
步骤3:生成分组ID并拆分
通过累计求和生成每个分组的唯一ID,再按ID拆分出独立的DataFrame:
# 生成分组ID:每遇到一个标题行,ID递增 df['group_id'] = df['is_header'].cumsum() # 存储所有分组的DataFrame,键为分组标题,值为对应子DataFrame group_dfs = {} for gid in df['group_id'].unique(): group_data = df[df['group_id'] == gid].reset_index(drop=True) # 获取当前分组的标题名称 header_name = group_data[group_data['is_header']]['Name'].iloc[0] group_dfs[header_name] = group_data # 调用示例:获取第一个分组的DataFrame first_group_df = group_dfs['First Group Header']
补充说明
- 每个子DataFrame默认包含对应分组的标题行和所有数据行,如果不需要标题行,可在拆分时加上
group_data = group_data[~group_data['is_header']]过滤掉标题行。 - 该方案适配分组数据行数不固定的情况,只要标题名称或格式不变,就能自动识别分组。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

