Python读取多表头可变列CSV并按Method拆分补零
我来帮你搞定这个合并CSV拆分的需求,下面是一个实用的Python解决方案,完全匹配你的要求:
解决方案思路
- 先把原始CSV里的多个迷你表格拆分出来——每个迷你表格都是以
ID Method开头的行作为表头,后面跟着对应的数据行。 - 把每个迷你表格转换成DataFrame,然后按
Method列的值(Soil/Datas)分类收集。 - 对同一Method下的所有表格进行合并,统一所有出现过的列,缺失的列值用0填充。
- 最后把合并后的结果分别保存成两个独立的CSV文件。
完整代码
import pandas as pd import io # ---------------------- 配置部分 ---------------------- # 替换成你的原始CSV文件路径 input_file_path = "your_input.csv" # ----------------------------------------------------- # 读取原始文件内容 with open(input_file_path, 'r') as f: raw_data = f.read() # 分割原始数据为多个独立的子表格 tables = [] current_table = [] for line in raw_data.split('\n'): line = line.strip() if not line: continue # 识别表头行(以"ID Method"开头) if line.startswith('ID Method'): if current_table: tables.append(current_table) current_table = [] current_table.append(line) else: current_table.append(line) # 添加最后一个未处理的子表格 if current_table: tables.append(current_table) # 按Method分类存储DataFrame method_dfs = {'Soil': [], 'Datas': []} for table in tables: # 将子表格内容转为DataFrame(如果是逗号分隔CSV,把sep='\s+'改成sep=',') df = pd.read_csv(io.StringIO('\n'.join(table)), sep='\s+') # 获取当前表格的Method类型(假设每个子表格所有行属于同一Method) current_method = df['Method'].iloc[0] method_dfs[current_method].append(df) # 合并同一Method的表格并输出 for method, dfs in method_dfs.items(): if not dfs: print(f"未找到{method}类型的数据") continue # 合并所有表格,缺失列填充0 merged_df = pd.concat(dfs, ignore_index=True).fillna(0) # 将数值列转为整数(保持和原始数据一致的类型) for col in merged_df.columns[2:]: merged_df[col] = merged_df[col].astype(int) # 保存为CSV文件 output_path = f"{method}_output.csv" merged_df.to_csv(output_path, index=False) print(f"✅ {method}类型数据已成功导出到:{output_path}")
代码解释
- 分割子表格:遍历原始文件的每一行,遇到表头行就把之前累积的行作为一个完整子表格保存,确保每个迷你表格被单独处理。
- 读取为DataFrame:用
pandas的read_csv读取每个子表格,这里用sep='\s+'适配你示例中的空格分隔格式,如果你的实际CSV是逗号分隔,改成sep=','即可。 - 分类收集:每个子表格的所有行都属于同一个Method,所以提取第一行的Method值,把DataFrame放到对应列表里。
- 合并与填充:用
pd.concat合并同一Method的所有表格,fillna(0)自动给缺失的列填充0,最后把数值列转为整数,保证输出格式和示例一致。
注意事项
- 如果你的原始CSV有特殊分隔符(比如制表符),请调整
sep参数的值(制表符用sep='\t')。 - 代码会自动处理原始文件中的空行,无需提前清理。
- 输出的CSV会包含所有在原始数据中出现过的列,缺失值统一填充为0,完全匹配你给出的目标示例。
内容的提问来源于stack exchange,提问作者WillAgri
相关产品推荐
相关产品推荐

