如何按规则将Pandas DataFrame拆分为多个含固定列数的小型DataFrame
Pandas DataFrame按规则拆分方案
核心思路
- 第一步提取所有列名,分离出公共列
Title和后续的业务数据列 - 第二步将业务数据列按每4个为一组做等分切片,自动适配任意数量的文件分组场景
- 第三步每组数据列前拼接
Title列,提取对应数据生成独立的子DataFrame
完整可运行代码
import pandas as pd # 示例大表构造 thisdict = {'Title': ['aaarrr','hahahamhm','yaaahooo','yaahoo', 'oopsymhm', 'ayorrr'], 'df1_data1': ['324','123','444','NOTHING', 'NOTHING', 'NOTHING'], 'df1_data2': ['4314','4321','7658','NOTHING', 'NOTHING', 'NOTHING'], 'df1_data3': ['342','111','235','NOTHING', 'NOTHING', 'NOTHING'], 'df1_data4': ['325','542','523','NOTHING', 'NOTHING', 'NOTHING'], 'df2_data1': ['1','NOTHING','NOTHING','4', '3', 'NOTHING'], 'df2_data2': ['2','NOTHING','NOTHING','3', '2', 'NOTHING'], 'df2_data3': ['3','NOTHING','NOTHING','2', '4', 'NOTHING'], 'df2_data4': ['4','NOTHING','NOTHING','1', '1', 'NOTHING'], 'df3_data1': ['NOTHING','NOTHING','NOTHING','2', '67', '4'], 'df3_data2': ['NOTHING','NOTHING','NOTHING','73', '2', '7'], 'df3_data3': ['NOTHING','NOTHING','NOTHING','2', '4', '5'], 'df3_data4': ['NOTHING', 'NOTHING', 'NOTHING', '1', '0', '9'] } dataframe = pd.DataFrame(thisdict) # 拆分逻辑 sub_dfs = [] group_size = 4 # 提取除Title外的所有业务列 business_cols = dataframe.columns[1:] # 按每4列一组拆分 for i in range(0, len(business_cols), group_size): current_cols = ['Title'] + business_cols[i:i+group_size].tolist() # 生成子DataFrame,加copy避免修改原表 sub_df = dataframe[current_cols].copy() sub_dfs.append(sub_df) # 测试打印结果 for idx, df in enumerate(sub_dfs): print(f"第{idx+1}个拆分后DataFrame列:{df.columns.tolist()}")
效果验证
运行上述代码后输出结果如下,完全符合需求要求:
第1个拆分后DataFrame列:['Title', 'df1_data1', 'df1_data2', 'df1_data3', 'df1_data4'] 第2个拆分后DataFrame列:['Title', 'df2_data1', 'df2_data2', 'df2_data3', 'df2_data4'] 第3个拆分后DataFrame列:['Title', 'df3_data1', 'df3_data2', 'df3_data3', 'df3_data4']
扩展说明
如果需要更方便的调用子表,可以用字典存储,以分组标识作为key,实现代码如下:
sub_df_dict = {} for i in range(0, len(business_cols), group_size): current_cols = business_cols[i:i+group_size].tolist() # 提取df1、df2这类分组前缀作为key group_key = current_cols[0].split('_')[0] sub_df_dict[group_key] = dataframe[['Title'] + current_cols].copy()
内容的提问来源于stack exchange,提问作者Mteyra
相关产品推荐
相关产品推荐

