实际生活中处理数据 会面临到一种多行多列转置的问题
例如截图
现在有这么一组数据需要进行处理,因为是要保存到数据库,这里我列出来的时间仅是几列,并不是很多,如果很多的话 放到数据库里面是相当不方便的,并且别人使用数据也不是很方便
现在需要进行处理到如下情况
单纯的使用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,因为都为3个3个匹配 所以写个函数 将数据切割为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)
里面有很多细节的地方,我能想到的都添加了注释,上面是我按照我的理解 解决了这个问题,如果有更好的解决方案,欢迎大家可以提出,如果有建议或者不理解的地方可以留言给我