使用Pandas转置列并整理非结构化CSV文件
处理格式混乱的CSV文件,提取固定索引的目标信息
针对你这种冗余列数量不定但目标列索引固定的CSV处理需求,用Python的pandas库可以轻松搞定,下面是具体的实现方案,完全贴合你的示例需求:
核心思路
- 读取CSV时不预设表头(因为第一行包含冗余信息);
- 从固定索引位置提取公司名称、指标名称(如VisitsMay)和分类名称(如International);
- 重新构造符合要求的表格结构,将原表的"指标列"转成新表的"行",并匹配对应分类的数值。
单文件处理代码
import pandas as pd # 读取CSV文件,注意不要设置header,保留所有原始行 df = pd.read_csv('your_input_file.csv', header=None) # ---------------------- 这里根据你的实际固定索引调整 ---------------------- # 示例中公司名在第7列(索引从0开始是6),格式为"Companyname: Apple" company_col_index = 6 # 示例中指标列从第8列开始(索引7) metrics_start_index = 7 # 示例中分类名称在第6列(索引5) category_col_index = 5 # ----------------------------------------------------------------------- # 提取公司名称 company_name = df.iloc[0, company_col_index].split(': ')[1] # 提取所有指标名称(如VisitsMay、ImpressionsMay) metrics = df.iloc[0, metrics_start_index:].tolist() # 提取每个分类对应的指标数值 category_data = [] for row_idx in range(1, len(df)): # 跳过第一行的冗余表头 category_name = df.iloc[row_idx, category_col_index] metric_values = df.iloc[row_idx, metrics_start_index:].tolist() category_data.append((category_name, metric_values)) # 构造目标格式的行数据 output_rows = [] for metric in metrics: # 每行开头是公司名+指标名 current_row = [company_name, metric] # 依次添加每个分类对应的数值 for cat_name, cat_values in category_data: current_row.append(cat_values[metrics.index(metric)]) output_rows.append(current_row) # 创建结果DataFrame并保存 output_columns = ['Companyname', 'Month'] + [cat[0] for cat in category_data] result_df = pd.DataFrame(output_rows, columns=output_columns) result_df.to_csv('your_output_file.csv', index=False)
多批量处理代码
如果你有大量CSV需要处理,可以用循环遍历文件夹下的所有CSV文件:
import pandas as pd import os # 替换成你的CSV文件夹路径 input_folder = 'path/to/your/csv/folder' output_folder = 'path/to/save/processed/files' # 创建输出文件夹(如果不存在) os.makedirs(output_folder, exist_ok=True) # ---------------------- 同样根据实际索引调整这里的数值 ---------------------- company_col_index = 6 metrics_start_index = 7 category_col_index = 5 # ----------------------------------------------------------------------- for filename in os.listdir(input_folder): if filename.endswith('.csv'): input_path = os.path.join(input_folder, filename) df = pd.read_csv(input_path, header=None) # 提取公司名 try: company_name = df.iloc[0, company_col_index].split(': ')[1] except IndexError: print(f"跳过文件 {filename}:未找到指定索引的公司名列") continue # 提取指标和分类数据 metrics = df.iloc[0, metrics_start_index:].tolist() category_data = [] valid_rows = True for row_idx in range(1, len(df)): try: category_name = df.iloc[row_idx, category_col_index] metric_values = df.iloc[row_idx, metrics_start_index:].tolist() category_data.append((category_name, metric_values)) except IndexError: valid_rows = False break if not valid_rows: print(f"跳过文件 {filename}:部分行数据不完整") continue # 构造输出数据 output_rows = [] for metric in metrics: current_row = [company_name, metric] for cat_name, cat_values in category_data: current_row.append(cat_values[metrics.index(metric)]) output_rows.append(current_row) # 保存结果 output_columns = ['Companyname', 'Month'] + [cat[0] for cat in category_data] result_df = pd.DataFrame(output_rows, columns=output_columns) output_path = os.path.join(output_folder, f"processed_{filename}") result_df.to_csv(output_path, index=False) print(f"已处理完成:{filename}")
关键调整说明
- 你只需要根据真实的CSV结构,修改代码中标记的三个索引值(
company_col_index、metrics_start_index、category_col_index)即可适配你的文件; - 如果公司名的格式不是
Companyname: XXX,可以调整company_name的提取逻辑,比如直接取对应列的值; - 代码中加入了简单的错误处理,避免因个别文件格式异常导致整个批量处理中断。
内容的提问来源于stack exchange,提问作者edyvedy13
相关产品推荐
相关产品推荐

