如何在检测到特定字符串时拆分DataFrame并生成多个子DataFrame
拆分结构化大DataFrame为多个子数据集
问题描述
现有结构如下的大DataFrame(实际包含约24K列):
col_1 col_2 col_3 NaN NaN NaN Date 21-04-2022 NaN Id Name status 01 A11 Pass 02 A22 F_1 03 A33 P_2 SUMMARY 'Total :$20 Approved $ 10' NaN NaN NaN NaN Date 22-04-2022 NaN Id Name status 04 A12 P_2 05 A23 F_1 06 A34 P_2 SUMMARY 'Total :$30 Approved $ 20' NaN
需要将其拆分为多个子DataFrame,每个子DataFrame包含对应日期块的表头、数据行与汇总行,示例如下:
df_1:
Id Name status 01 A11 Pass 02 A22 F_1 03 A33 P_2 SUMMARY 'Total :$20 Approved $ 10' NaN
df_2:
Id Name status 04 A12 P_2 05 A23 F_1 06 A34 P_2 SUMMARY 'Total :$30 Approved $ 20' NaN
解决方案
通过定位数据块的起始(表头行)与结束(汇总行)索引,批量提取并生成子DataFrame,具体实现如下:
代码实现
import pandas as pd # 假设原始数据已加载为DataFrame df,以下为模拟示例数据 data = [ [pd.NA, pd.NA, pd.NA], ['Date', '21-04-2022', pd.NA], ['Id', 'Name', 'status'], ['01', 'A11', 'Pass'], ['02', 'A22', 'F_1'], ['03', 'A33', 'P_2'], ['SUMMARY', "'Total :$20 Approved $ 10'", pd.NA], [pd.NA, pd.NA, pd.NA], ['Date', '22-04-2022', pd.NA], ['Id', 'Name', 'status'], ['04', 'A12', 'P_2'], ['05', 'A23', 'F_1'], ['06', 'A34', 'P_2'], ['SUMMARY', "'Total :$30 Approved $ 20'", pd.NA] ] df = pd.DataFrame(data, columns=['col_1', 'col_2', 'col_3']) # 定位所有表头行(col_1为'Id'的行)的索引 header_indices = df[df['col_1'] == 'Id'].index.tolist() # 定位所有汇总行(col_1为'SUMMARY'的行)的索引 summary_indices = df[df['col_1'] == 'SUMMARY'].index.tolist() # 存储所有子DataFrame的列表(避免大量单独命名变量,更易管理) sub_dfs = [] # 遍历每个数据块的起始与结束索引 for header_idx, summary_idx in zip(header_indices, summary_indices): # 获取当前块的列名(取自表头行) block_columns = df.loc[header_idx].tolist() # 提取当前块的所有数据行(表头行下一行到汇总行) block_rows = df.loc[header_idx + 1 : summary_idx].values.tolist() # 创建子DataFrame并添加到列表 sub_df = pd.DataFrame(block_rows, columns=block_columns) sub_dfs.append(sub_df) # 访问子DataFrame示例:sub_dfs[0]对应df_1,sub_dfs[1]对应df_2 print(sub_dfs[0])
说明
- 高效定位:通过布尔索引快速找到所有表头行与汇总行的索引,避免逐行遍历,适配24K列的大数据集。
- 批量处理:将所有子DataFrame存入列表
sub_dfs,无需手动命名大量变量,便于后续批量操作(如遍历分析、保存文件等)。 - 结构匹配:自动将每个块的表头行设置为子DataFrame的列名,完全匹配需求中的子数据集结构。
内容的提问来源于stack exchange,提问作者Romi
相关产品推荐
相关产品推荐

