减少复制黏贴的代码行 2
Excel 虽然用起来也很快,但是有一个非常大的缺陷,就是操作步骤的不保留。可视化的界面和全控件的操作 上手快的同时,也增加了重复的操作。
每天都要维护表格 或者 每天都有相同的工作需要在Excel上完成的话,我们就要每天做一次相同的工作。
即使可以将公式写进excel 模板,但是有一些复制 黏贴原数据的工作仍然需要手动操作。
下面的代码就是为了解决日常工作中重复率非常高的基础性工作而产生的。
需求:
将订单商城上的订单导出后,整理成批量下单模板,上传到下单系统中。
订单商城上订单格式不同,但是来源于两类客户:
第一类客户,要求删除掉 产品名称中包含 特定城市 ['山西','怀化',..] 的记录行。
第二类客户,需要将产品名称 和 商品编号 分列(‘,’)出来。一个订单号中可能包含1,2,3,4个产品。需要将产品拆出来 独立成记录行,方便下单。
然后产品名称中包含着产品数量,需要将数量分列出来('*').
数据整理出来之后,需要和产品价格编码表进行匹配,因为下单需要erp 编码 和 单价
最后需要按照下单的导入模板 要求制作EXCEL表
实现
import pandas as pd import time import os src = r'E:\6月 ' li = os.listdir(src) df2 = pd.read_excel(src+"\\"+li[1],sheet_name = 0,dtype=str) df2['订单来源']='沙龙' # 对商品名称和商品编号分列 df2_1 = df2['商品名称'].str.split(',',expand=True) df2_2 = df2['商品编号'].str.split(',',expand=True) # 查看结构,共有多少列 print(df2_1.shape,df2_2.shape) # 商品名称和编号 汇总到一列 添加到一张表 df2_1 = df2_1[0].append([df2_1[1],df2_1[2]]) df2_2 = df2_2[0].append([df2_2[1],df2_2[2]]) df3 = pd.DataFrame(data={'商品名称':df2_1,'商品编号':df2_2}) # 删除空值 df3.dropna(axis=0,inplace=True) # 复制索引 作为匹配列 df3['序号'] = df3.index df2['序号'] = df2.index # df连接新的商品名称和商品编号 df2 = df2.join(df3,on = '序号',how = 'left',rsuffix='_df3') # 更新商品名称和编号,删除多余的列 df2['商品名称'] = df2['商品名称_df3'] df2['商品编号'] = df2['商品编号_df3'] df2.drop(columns=['商品名称_df3','商品编号_df3','序号','序号_df3'],inplace=True) # 按索引值排序 df2.sort_index(inplace=True) df1 = pd.read_excel(src+"\\"+li[0],sheet_name = 0,dtype=str) df1['订单来源']='二维码' # 合并二维码和沙龙表格 df4 = df1.append(df2) # 分列出数量 df = df4['商品名称'].str.split('*',expand=True) df4['商品名称'] = df[[0]] # 在商品名称后插入一列商品数量 col_name = df4.columns.to_list() col_name.insert(2,'商品数量') df4 = df4.reindex(columns=col_name) df4['商品数量']=df[[1]] # 删除包含商品名称中含有 山西,衡阳,怀化等的行 drop_li = ['精品毛巾套装', '楼楼定制款马克杯','山西','恩施','天津','衡阳','怀化'] for i in drop_li: df4.drop(labels=df4.loc[df4['商品名称'].str.contains(i)].index,inplace = True) # 保存到Excel df4 = df4.astype({'商品数量': 'float'}) time_now = time.strftime("%Y%m%d %H%M%S",time.localtime()) df4.to_excel(r'E:\6月 \线上订单汇总%s.xlsx'%time_now,index=False) # 匹配产品价格,编码等信息 df5 = pd.read_excel(r'E:\订单操作\产品 价格匹配表.xlsx',sheet_name='产品匹配表',dtype=str) # 多对一级联 df6 = df4.merge(df5[['商品名称','erp','单价','合同序号','地区']],how = 'left',on = '商品名称',validate='m:1') # 查看erp编码为空的记录行,说明有新的商品名 df6.loc[df6['erp'].isnull()]['商品名称'] # 电话或者地址为空的记录行,填补空信息 df6.loc[df6['收货人电话'].isnull()] df6.loc[df6['收货地址'].isnull()] # 替换 收货地址中的 错误信息 df7 = pd.read_excel(r'E:\订单操作\录单模板.xlsx',sheet_name = '替换地址') df7 = df7[:3] for i in df7.index: df6.loc[df6['收货地址'].str.contains(df7.loc[i,'原地址'])]['收货地址'].str.replace(df7.loc[i,'原地址'],df7.loc[i,'待替换']) # 制作积福导入模板 df8 = pd.read_excel(r'E:\订单操作\录单模板.xlsx',sheet_name = '导入',dtype=str) # 扩展积福模板的列名列表 col_name_8 = df8.columns.to_list() col_name_6 = df6.columns.to_list() for i in col_name_6: col_name_8.append(i) # 更细df6 线上订单数据表 的列明,并填充数据 df9 = df6.reindex(columns=col_name_8) # 填充数据 df9['客户名称'] = '*工业有限责任公司' df9['下单店铺'] = '*' df9['销售类型'] = 'API数字化供应链' df9['单据类型'] = 'B2C订单' df9['是否签回单'] = '否' df9['erp编码'] = df9['erp'] df9['erp开单价\n(仅支持数字)'] = df9['单价'] df9['购买数量\n(仅支持数字)'] = df9['商品数量'] df9['发货仓库'] = '0715' df9['承运商'] = '邮政小包' df9['运输方式'] = '' df9['是否赠品'] = '否' df9['收货人'] = df9.iloc[:,29] df9['收货人手机'] = df9['收货人电话'] df9['详细地址'] = df9['收货地址'] df9['备注'] = '*项目,贴标放卡' df9['第三方订单号'] = df9['订单编号'] df9['发货方式'] = '具体仓库' df9['供应商'] = '*科技股份有限公司' # 截取0-19列 保存到excel表 l = range(0,19) df9 = df9.iloc[:,l] df9.to_excel(r'E:\ 录单模板%s.xlsx'%time_now,index=False)