如何用Python将单行数据拆分为多行并导出至Excel?
问题描述
我有如下访客数据:
l = [ ['Visitors', '1 February 2020', 'Saturday', 'Shop A', 'In', '100', '20', '30','150', 'Out', '90', '10', '15', '115'], ['Visitors', '1 February 2020', 'Saturday', 'Shop B', 'In', '20', '10', '40', '70', 'Out', '10', '9', '0', '19'], ['Visitors', '1 February 2020', 'Saturday', 'Shop C', 'In', '42', '18', '20', '80', 'Out', '40', '10', '20', '70'], ['Visitors', '1 February 2020', 'Saturday', 'Shop D', 'In', '0', '0', '0', '0', 'Out', '0', '0', '0', '0'], ['Visitors', '1 February 2020', 'Saturday', 'Shop E', 'In', '0', '0', '0', '0', 'Out', '0', '0', '0', '0'], ['Visitors', '1 February 2020', 'Saturday', 'Shop F', 'In', '20', '19', '11', '50', 'Out', '10', '9', '5', '24'], ['Visitors', '1 February 2020', 'Saturday', 'Shop G', 'In', '25', '8', '33', '66', 'Out', '20', '6', '30', '56'], ['Visitors', '1 February 2020', 'Saturday', 'Shop H', 'In', '180', '88', '6', '274', 'Out', '170', '80', '5', '255'], ['Visitors', '1 February 2020', 'Saturday', 'Shop I', 'In', '0', '0', '0', '0', 'Out', '0', '0', '0', '0'], ['Visitors', '1 February 2020', 'Saturday', 'Total', 'In', '387', '163', '140', '690', 'Out', '340', '124', '75', '539'], ]
原始数据的结构定义为:
[Ppl_type, Date, Weekday, Shop, In, Men, Women, Children, Total, Out, Men, Women, Children, Total]
需要将其转换为指定格式并导出到Excel,目标表头为:
header = ['Ppl_type', 'Date', 'Weekday', 'Shop', 'In/Out', 'Visitor_Type', 'Number']
转换规则:每个店铺对应6行数据——3行记录进入的访客类型(男性、女性、儿童),3行记录离开的访客类型(男性、女性、儿童)。我尝试用worksheet.write方法,但只能处理前4列,求Python实现方案。
解决方案
核心思路
先把原始数据逐条转换为目标格式的多行数据:
- 提取每条原始数据的公共字段:
Ppl_type、Date、Weekday、Shop - 分别处理「进入」和「离开」两个部分:
- 「进入」部分对应原始数据的第5到第8位(索引4到7),分别对应
In、男性、女性、儿童的数值 - 「离开」部分对应原始数据的第9到第13位(索引8到12),分别对应
Out、男性、女性、儿童的数值
- 「进入」部分对应原始数据的第5到第8位(索引4到7),分别对应
- 对每个进出方向,生成3条记录,分别对应男性、女性、儿童的访客数
完整代码实现
先确保安装openpyxl库(处理Excel文件的常用工具):
pip install openpyxl
转换并导出的代码:
from openpyxl import Workbook # 原始数据 l = [ ['Visitors', '1 February 2020', 'Saturday', 'Shop A', 'In', '100', '20', '30','150', 'Out', '90', '10', '15', '115'], ['Visitors', '1 February 2020', 'Saturday', 'Shop B', 'In', '20', '10', '40', '70', 'Out', '10', '9', '0', '19'], ['Visitors', '1 February 2020', 'Saturday', 'Shop C', 'In', '42', '18', '20', '80', 'Out', '40', '10', '20', '70'], ['Visitors', '1 February 2020', 'Saturday', 'Shop D', 'In', '0', '0', '0', '0', 'Out', '0', '0', '0', '0'], ['Visitors', '1 February 2020', 'Saturday', 'Shop E', 'In', '0', '0', '0', '0', 'Out', '0', '0', '0', '0'], ['Visitors', '1 February 2020', 'Saturday', 'Shop F', 'In', '20', '19', '11', '50', 'Out', '10', '9', '5', '24'], ['Visitors', '1 February 2020', 'Saturday', 'Shop G', 'In', '25', '8', '33', '66', 'Out', '20', '6', '30', '56'], ['Visitors', '1 February 2020', 'Saturday', 'Shop H', 'In', '180', '88', '6', '274', 'Out', '170', '80', '5', '255'], ['Visitors', '1 February 2020', 'Saturday', 'Shop I', 'In', '0', '0', '0', '0', 'Out', '0', '0', '0', '0'], ['Visitors', '1 February 2020', 'Saturday', 'Total', 'In', '387', '163', '140', '690', 'Out', '340', '124', '75', '539'], ] # 目标表头 header = ['Ppl_type', 'Date', 'Weekday', 'Shop', 'In/Out', 'Visitor_Type', 'Number'] # 初始化工作簿和工作表 wb = Workbook() ws = wb.active ws.title = "Visitor Data" # 写入表头 ws.append(header) # 遍历原始数据,转换格式 for row in l: # 提取公共字段 ppl_type = row[0] date = row[1] weekday = row[2] shop = row[3] # 处理「进入」数据:生成男性、女性、儿童三条记录 ws.append([ppl_type, date, weekday, shop, 'In', 'Men', row[5]]) ws.append([ppl_type, date, weekday, shop, 'In', 'Women', row[6]]) ws.append([ppl_type, date, weekday, shop, 'In', 'Children', row[7]]) # 处理「离开」数据:生成男性、女性、儿童三条记录 ws.append([ppl_type, date, weekday, shop, 'Out', 'Men', row[10]]) ws.append([ppl_type, date, weekday, shop, 'Out', 'Women', row[11]]) ws.append([ppl_type, date, weekday, shop, 'Out', 'Children', row[12]]) # 保存Excel文件 wb.save("visitor_report.xlsx")
代码说明
- 字段复用:每条原始数据的前4个字段是所有衍生记录的公共字段,直接提取复用即可
- 数据拆分:针对「进入」「离开」两个方向,分别取出对应性别/年龄段的数值,生成符合目标格式的行
- Excel写入:使用
openpyxl的append方法可以直接将整行数据写入工作表,无需手动指定单元格索引,解决了worksheet.write逐个处理单元格的繁琐问题 - 结果验证:运行后会生成
visitor_report.xlsx文件,每个原始行对应6条目标格式的记录,完全符合需求
内容的提问来源于stack exchange,提问作者poon cl
相关产品推荐
相关产品推荐

