Python实现重复与非重复行转表头并保留对应数据
解决方案:CSV数据结构转换实现
问题分析
原始CSV以「键-类型」行开头,后续是多组列值(每组4行),最后追加额外「键-值」行;需要将其转换为列名对应原始键,每行对应类型+各组值的结构。
Pandas 实现方案
利用Pandas的行索引和数据构造能力快速实现转换:
import pandas as pd # 读取CSV,处理逗号后空格 df = pd.read_csv('input.csv', header=None, skipinitialspace=True) # 提取主键与类型(第一行数据) main_key, main_type = df.iloc[0] # 按每4行一组,提取3组A-D的数值数据 groups = [df.iloc[1+i*4 : 1+(i+1)*4] for i in range(3)] # 提取末尾的额外键值对 extra_key, extra_value = df.iloc[-1] # 构造结果列名 columns = [main_key] + groups[0][0].tolist() + [extra_key] # 构造每行数据:类型 + 对应组数值 + 额外值 data_rows = [[main_type] + group[1].tolist() + [extra_value] for group in groups] # 生成结果DataFrame并输出 result_df = pd.DataFrame(data_rows, columns=columns) print(result_df.to_string(index=False))
纯Python 实现方案(无需第三方库)
如果不想依赖Pandas,可直接用Python原生处理:
# 读取并解析CSV内容 with open('input.csv', 'r') as f: lines = [line.strip().split(', ') for line in f if line.strip()] # 提取主键、类型与额外键值 main_key, main_type = lines[0] extra_key, extra_value = lines[-1] # 分组提取A-D的数值数据 groups = [lines[1+i*4 : 1+(i+1)*4] for i in range(3)] # 构造列名与数据行 columns = [main_key] + [item[0] for item in groups[0]] + [extra_key] data_rows = [[main_type] + [item[1] for item in group] + [extra_value] for group in groups] # 计算列宽,格式化对齐输出 max_col_widths = [ max(len(str(col)), max(len(str(row[i])) for row in data_rows)) for i, col in enumerate(columns) ] # 打印表头 print(' '.join(f"{col:<{max_col_widths[i]}}" for i, col in enumerate(columns))) # 打印数据行 for row in data_rows: print(' '.join(f"{val:<{max_col_widths[i]}}" for i, val in enumerate(row)))
输出效果
运行后会生成符合需求的格式化输出:
cat A B C D blue animal 5000 6000 8000 6000 color animal 3000 2000 6000 1000 color animal 4000 1000 1000 3000 color
内容的提问来源于stack exchange,提问作者Nycbros
相关产品推荐
相关产品推荐

