pandas处理多行多列转置问题

实际生活中处理数据 会面临到一种多行多列转置的问题
例如截图
在这里插入图片描述
现在有这么一组数据需要进行处理,因为是要保存到数据库,这里我列出来的时间仅是几列,并不是很多,如果很多的话 放到数据库里面是相当不方便的,并且别人使用数据也不是很方便
现在需要进行处理到如下情况
在这里插入图片描述
单纯的使用pandas的内置函数stack()或者unstack()是不能够直接实现的 这里主要运用了一种解题的思想——拆解问题
一些较难直接实现的问题 我们可以进行分步进行实现
可以看到上面的从“物料名称”到“日期”是一部分,“采购入库”到“退回”是一部分,上面的日期也是一部分
可以单独将这三列 取出来 然后使用循环添加到列表里面 再使用DataFrame(list,columns=[])直接形成dataframe格式的数据并输出到excel或者csv
我的解决思路是使用较简单的循环,因为日期是4种,后面的采购入库到退回也是4次,当然如果日期比现在更多,比如我做的是一个月或者1年的 这个循环次数也会相对添加,好了,废话不多说 直接上代码
这里我会多添加一个sheet,因为一般情况下,像这种数据很少是只有一个月的 一般都是一个月是一个sheet
在这里插入图片描述

这里需要注意的是因为有合并单元格的列,所以需要进行处理下,详细的处理方式请参照

可以看下都进去的截图
在这里插入图片描述

[https://blog.csdn.net/KIKI_ZSH/article/details/122696721?spm=1001.2014.3001.5502]

import openpyxl
import datetime
import pandas as pd
from math import ceil
from openpyxl import load_workbook

filename = r'D:\Program\Blog\data\test_fr.xlsx'
# 使用openpyxl获取所有的sheet名
wb = load_workbook(filename)
'''
因为有多余没用的sheet,并且有用的sheet都含有"月"这个字,所以
列表推导式存入所有的有用sheet
'''
userful_sheet = [sheetname for sheetname in wb.sheetnames if '月' in sheetname]
# 创建一个空列表,以便将所有处理好的数据放入其中
data_all = []
for sheetname2 in userful_sheet:
	data = pd.read_excel(filename, sheet_name=sheetname2, header=None)
	# 取出为时间里类型的列名
	time_col = data.iloc[0,:].tolist()
	time_cols = [col for col in time_col if type(col) == datetime.datetime]
	print('time_cols: \n',time_cols)
	use_col = data.iloc[1,:9].tolist()
	use_col.insert(6,'日期')
	print("================================\n")
	print('use col: \n', use_col)
	# 含有两个指定的阶段 就是含有两个:的取出来的值类型为dataframe,不能直接转换为list,所以需要先values
	use_value = data.iloc[2:,:6].values.tolist()
	print("================================\n")
	print('use value: \n', use_value)
	use_value2 = data.iloc[2:,6:].values.tolist()
	print("================================\n")
	print('use value2: n', use_value2)
	# 观察use_value2,因为都为33个匹配 所以写个函数 将数据切割为3 3 3的列表
	def chunk(lst, size):
	    return list(map(lambda x: lst[x * size: x * size + size],
	                   list(range(0, ceil(len(lst)/size)))))
	
	data1 = []
	for i in range(len(use_value)):
	    data_value = use_value[i]
	    data2_value = chunk(use_value2[i], 3)
	    for j in range(len(use_value[0:len(time_cols)])):
	        time_time = time_cols[j]
	        data1.append(time_time)
	        data_value = data_value + data1
	        data_value = data_value + data2_value[j]
	        print(data_value)
	        data_all.append(data_value)
	        data_value = use_value[i]
	        data1 = []


print(data_all,'\n')


data_complete = pd.DataFrame(data_all, columns=use_col)
data_complete.to_excel('complete数据.xlsx', index=False)				

里面有很多细节的地方,我能想到的都添加了注释,上面是我按照我的理解 解决了这个问题,如果有更好的解决方案,欢迎大家可以提出,如果有建议或者不理解的地方可以留言给我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vergil_Zsh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值