如何使用Pandas将CSV横向条目转换为指定纵向分组格式?
CSV格式转换解决方案
问题说明
现有原始CSV内容如下:
apple,orange,bannana,grape 10,5,6,4 four,seven,eight,nine yes,yes,no,yes 3,5,7,4 two,one,six,nine no,no,no,yes 2,4,7,8 yellow,four,eight,one no,yes,no,no
需要转换为如下格式的CSV:每4行原始数据为一组(首行是列名,之后3行是对应值),将每组的列名与对应行的同列值依次组合成新行,处理完一组后自动用下一组数据重复该结构:
apple,10,four,yes orange,5,seven,yes bannana,6,eight,no grape,4,nine,yes apple,3,two,no orange,5,one,no bannana,7,six,no grape,4,nine,yes apple,2,yellow,no orange,4,four,yes bannana,7,eight,no grape,8,one,no
注:原示例目标CSV中bannana行的第三个值存在笔误,正确应为eight,以下方案按原始数据的对应关系生成结果。此前尝试用Pandas DataFrame未完成转换,现提供可行方案。
解决方案(基于Pandas)
核心思路是将原始数据按3行一组拆分(对应原始文件中列名后的3行数据),对每组进行「列名+列值」的行拼接,最后合并所有组的结果。
代码实现
import pandas as pd # 读取原始CSV,首行自动作为列名 df = pd.read_csv('input.csv', header=0) # 每3行数据对应一组完整的列名+值组合 group_size = 3 # 给每行数据打分组标签 df['group_tag'] = df.index // group_size result = [] # 遍历每个数据组 for tag in df['group_tag'].unique(): group_data = df[df['group_tag'] == tag] # 遍历每个列名,拼接列名与该列的3个值为一行 for col_name in df.columns[:-1]: # 排除分组标签列 new_row = [col_name] + group_data[col_name].tolist() result.append(new_row) # 转换为DataFrame并保存为目标CSV pd.DataFrame(result).to_csv('output.csv', index=False, header=False)
代码说明
- 数据读取:用
pd.read_csv读取原始文件,自动识别首行作为列名。 - 分组标记:通过
index // group_size给每3行数据打上相同的分组标签,对应原始文件中一组完整的列名+值组合。 - 行拼接:对每个分组,遍历所有列,将列名与该列的3个值拼接成新行,存入结果列表。
- 结果保存:将结果列表转为DataFrame,无索引、无表头保存为目标CSV文件。
验证结果
运行代码后,生成的output.csv完全符合格式要求,可循环处理所有后续数据组。
内容的提问来源于stack exchange,提问作者pythonic
相关产品推荐
相关产品推荐

