处理文件题头格式
部门名称 年度名称 季节名称 商品名称 商品代码 品牌名称 品类名称 颜色名称 商店名称 0M 1L 1XL 27 28 29 2XL 30 31 32 33 3XL 4XL 5XL 6XL S 均
1.导入包
导入源文章来源:https://www.toymoban.com/news/detail-767321.html
pip install openpyxl -i https://pypi.doubanio.com/simple
pip install pandas -i https://pypi.doubanio.com/simple
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl import styles
from openpyxl.styles import *
import pandas as pd
import string
import re
import os
2读入数据
filePath1 = './src/本周销售明细.xlsx'
filePath2 = './src/上周销售明细.xlsx'
# 加载工作簿
wb = load_workbook(filePath1)
# 获取sheet页,修改第一个sheet页面为
name1 = wb.sheetnames[0]
ws1 = wb[name1]
ws1.title = "销售明细"
wb.save(filePath1)
# 销售明细
df0 = pd.read_excel(filePath1, sheet_name='销售明细')
合并两列数据文章来源地址https://www.toymoban.com/news/detail-767321.html
pd.merge(df1, #要合并的左表
df2, #要合并的右表
how = 'outer',#合并的方式:inner-内连接,outer--全外连接,left--左外连接,right--右外连接,外连接的时候,没有数据的地方会填充为NaN,默认为inner。
on=None,
#默认为None,合并的根据,要写出两个DataFrame共有的列,注意一定要是列名相同的,否则会报错,为list类型(多个列)或str(一列)
#如:['name']或者'name',默认None的时候,merge会自动寻找相同列名的列。
left_on=None,
right_on=None,
#当两表连接的根据列名字不一样的时候,用left on和right on列出两表连接的根据列,数值类型和on一样,默认None,比如df1和df3合并就需要用到left_on = 'name',right_on = '名字'。
left_index = False,
right_index = False,
#当进行连接的两表没有共同的根据列的时候,可以使用行索引进行合并,将left_index和right_index都设置为True即可,默认为False
sort = True) #根据连接用的列进行排序,默认为False
数据预处理
file_path1 = './src/本周销售明细.xlsx'
file_path2 = './src/上周销售明细.xlsx'
#修改工作簿表名为销售明细
sheet_name_deal(file_path1)
sheet_name_deal(file_path2)
file_path3 = './src/本周销售明细精修.xlsx'
file_path4 = './src/上周销售明细精修.xlsx'
creat_excel(file_path3)
creat_excel(file_path4)
#计算合计
index_list = ['部门名称', '年度名称', '季节名称', '商品代码', '商品名称', '品牌名称', '品类名称', '颜色名称', '商店名称']
value_list = ['0M', '1L', '1XL', '27', '28', '29', '2XL', '30', '3XL', '4XL', '5XL', '6XL', 'S', '均', '合计']
#读入数据
df1 = pd.read_excel(file_path1, sheet_name='销售明细')
df2 = pd.read_excel(file_path2, sheet_name='销售明细')
# 求和,需将文本的列指定为索引
df1 = df1.set_index(index_list)
# df1.loc["按列求和"] = df1.apply(lambda x: x.sum())
df1['合计'] = df1.apply(lambda x: x.sum(), axis=1)
# 求和,需将文本的列指定为索引
df2 = df2.set_index(index_list)
# df1.loc["按列求和"] = df1.apply(lambda x: x.sum())
df2['合计'] = df2.apply(lambda x: x.sum(), axis=1)
# 重置索引,防止导出excel列索引时单元格合并
df1 = df1.reset_index()
df2 = df2.reset_index()
# 将生成的工作表导入到程序中
result_sheet = pd.ExcelWriter(file_path3, engine='openpyxl') # 先定义要存入的文件名xxx,然后分别存入xxx下不同的sheet
# df1将0转变为空
df1 = df1.replace(0, '')
df1.to_excel(result_sheet, "销售明细", index=False, na_rep=0, inf_rep=0)
# 这步不能省,否则不生成文件
result_sheet._save()
# 将生成的工作表导入到程序中
result_sheet = pd.ExcelWriter(file_path4, engine='openpyxl') # 先定义要存入的文件名xxx,然后分别存入xxx下不同的sheet
# df1将0转变为空
df2.to_excel(result_sheet, "销售明细", index=False, na_rep=0, inf_rep=0)
# 这步不能省,否则不生成文件
result_sheet._save()
完整代码
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl import styles
from openpyxl.styles import *
import pandas as pd
import string
import re
import os
# Press the green button in the gutter to run the script.
def sheet_name_deal(file_path):
wb = load_workbook(file_path)
# 获取sheet页,修改第一个sheet页面名为销售明细
name1 = wb.sheetnames[0]
ws1 = wb[name1]
ws1.title = "销售明细"
wb.save(file_path)
def creat_excel(file_path):
# 没有就创建
if os.path.exists(file_path):
print("文件已存在")
print(file_path)
else:
# 创建一个新的 Excel 文件
wb = Workbook()
wb.save(file_path)
def pretreatment():
file_path1 = './src/本周销售明细.xlsx'
file_path2 = './src/上周销售明细.xlsx'
# 修改工作簿表名为销售明细
sheet_name_deal(file_path1)
sheet_name_deal(file_path2)
file_path3 = './src/本周销售明细精修.xlsx'
file_path4 = './src/上周销售明细精修.xlsx'
creat_excel(file_path3)
creat_excel(file_path4)
# 计算合计
index_list = ['部门名称', '年度名称', '季节名称', '商品代码', '商品名称', '品牌名称', '品类名称', '颜色名称', '商店名称']
value_list = ['0M', '1L', '1XL', '27', '28', '29', '2XL', '30', '3XL', '4XL', '5XL', '6XL', 'S', '均', '合计']
# 读入数据
df1 = pd.read_excel(file_path1, sheet_name='销售明细')
df2 = pd.read_excel(file_path2, sheet_name='销售明细')
# 求和,需将文本的列指定为索引
df1 = df1.set_index(index_list)
# df1.loc["按列求和"] = df1.apply(lambda x: x.sum())
df1['合计'] = df1.apply(lambda x: x.sum(), axis=1)
# 求和,需将文本的列指定为索引
df2 = df2.set_index(index_list)
# df1.loc["按列求和"] = df1.apply(lambda x: x.sum())
df2['合计'] = df2.apply(lambda x: x.sum(), axis=1)
# 重置索引,防止导出excel列索引时单元格合并
df1 = df1.reset_index()
df2 = df2.reset_index()
# 将生成的工作表导入到程序中
result_sheet = pd.ExcelWriter(file_path3, engine='openpyxl') # 先定义要存入的文件名xxx,然后分别存入xxx下不同的sheet
# df1将0转变为空
df1 = df1.replace(0, '')
df1.to_excel(result_sheet, "销售明细", index=False, na_rep=0, inf_rep=0)
# 这步不能省,否则不生成文件
result_sheet.save()
# 将生成的工作表导入到程序中
result_sheet = pd.ExcelWriter(file_path4, engine='openpyxl') # 先定义要存入的文件名xxx,然后分别存入xxx下不同的sheet
# df1将0转变为空
df2.to_excel(result_sheet, "销售明细", index=False, na_rep=0, inf_rep=0)
# 这步不能省,否则不生成文件
result_sheet.save()
if __name__ == '__main__':
pretreatment()
file_path3 = './src/本周销售明细精修.xlsx'
file_path4 = './src/上周销售明细精修.xlsx'
# 销售明细
df3 = pd.read_excel(file_path3, sheet_name='销售明细')
df4 = pd.read_excel(file_path4, sheet_name='销售明细')
# 部门周销
df01 = df3.pivot_table(index="部门名称", values="合计", aggfunc='sum').copy()
df01 = df01.reset_index()
df01.sort_values(by="合计", axis=0, ascending=False, inplace=True)
# 客户周销环比
index_list = ['部门名称', '商店名称']
# 本周客户周销
df021 = df3.pivot_table(index=index_list, values="合计", aggfunc='sum').copy()
# 上周客户周销
df022 = df4.pivot_table(index=index_list, values="合计", aggfunc='sum').copy()
# 全连接
# 重命名列
df021["本周销量"] = df021.pop('合计')
df022['上周销量'] = df022.pop('合计')
df023 = pd.merge(df021, df022, how='outer', left_index=True, right_index=True)
df023['销比'] = (df023['本周销量']-df023['上周销量'])/df023['上周销量']
df023 = df023.reset_index()
df023.sort_values(by="销比", axis=0, ascending=False, inplace=True)
#品类周销环比
#本周销量
df031 = df3.pivot_table(index="品类名称", values="合计", aggfunc='sum').copy()
#上周销量
df032 = df4.pivot_table(index="品类名称", values="合计", aggfunc='sum').copy()
# 全连接
# 重命名列
df031["本周销量"] = df031.pop('合计')
df032['上周销量'] = df032.pop('合计')
df033 = pd.merge(df031, df032, how='outer', left_index=True, right_index=True)
df033['销比'] = (df033['本周销量'] - df033['上周销量']) / df033['上周销量']
df033 = df033.reset_index()
df033.sort_values(by="销比", axis=0, ascending=False, inplace=True)
#季节周销
df04 = df3.pivot_table(index="季节名称", values="合计", aggfunc='sum').copy()
df04 = df04.reset_index()
df04.sort_values(by="合计", axis=0, ascending=False, inplace=True)
#品类周销
df05 = df3.pivot_table(index="品类名称", values="合计", aggfunc='sum').copy()
df05 = df05.reset_index()
df05.sort_values(by="合计", axis=0, ascending=False, inplace=True)
# 各部门品类销量前五
index_list = ['部门名称', '品类名称']
df060 = df3.pivot_table(index=index_list, values="合计", aggfunc='sum').copy()
df060 = df060.reset_index()
df061 = df060[df060['部门名称'] == '商品1部'].nlargest(5, '合计')
df062 = df060[df060['部门名称'] == '商品3部'].nlargest(5, '合计')
df063 = df060[df060['部门名称'] == '商品6部'].nlargest(5, '合计')
df064 = df060[df060['部门名称'] == '直营4部'].nlargest(5, '合计')
df065 = pd.concat([df061, df062, df063, df064])
#删除第一列数字索引
#df065 = df065.drop(df065.columns[0], axis=1)
#df065 = df065.pivot_table(index=index_list, values="合计", aggfunc='sum').copy()
df065.reset_index()
print(df065)
# 将生成的工作表导入到程序中
file_path5 = './src/双周数据图表.xlsx'
creat_excel(file_path5)
result_sheet = pd.ExcelWriter(file_path5, engine='openpyxl') # 先定义要存入的文件名xxx,然后分别存入xxx下不同的sheet
# df1将0转变为空
#部门周销
df01 = df01.replace(0, '')
df01.to_excel(result_sheet, "部门周销", index=False, na_rep=0, inf_rep=0)
# 客户周销环比
#将NaN替换为空白
df023 = df023.fillna('')
df023.to_excel(result_sheet, "客户周销环比", index=False, na_rep=0, inf_rep=0)
#品类周销环比
# 将NaN替换为空白
df033 = df033.fillna('')
df033.to_excel(result_sheet, "品类周销环比", index=False, na_rep=0, inf_rep=0)
# 季节周销
df04 = df04.replace(0, '')
df04.to_excel(result_sheet, "季节周销", index=False, na_rep=0, inf_rep=0)
# 品类周销
df05 = df05.replace(0, '')
df05.to_excel(result_sheet, "品类周销", index=False, na_rep=0, inf_rep=0)
# 品类部门周销排名
df065 = df065.replace(0, '')
df065.to_excel(result_sheet, "品类部门周销排名", index=False, na_rep=0, inf_rep=0)
# 这步不能省,否则不生成文件
result_sheet.save()
# See PyCharm help at https://www.jetbrains.com/help/pycharm/
到了这里,关于pandas处理双周数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!