#本代码要点:多表合并、数据透视表、拆分合并单元格并获得一维表
#主题:各门店合并,计算各店当月回店做服务2次+的客人数量
#EXCEL工作表:存在合并单元格
#备注:
import pandas as pd
import os
#多表合并
inputdir=r’C:\Users\HW\Desktop\新建文件夹’
df_empty=pd.DataFrame(columns=[‘开单分店’,‘顾客姓名’,‘手机号’,‘指标值’])
for parents,dirnames,filenames in os.walk(inputdir):
for filename in filenames:
df=pd.read_excel(os.path.join(parents,filename))
df_empty=df_empty.append(df,ignore_index=True)
#数据分组:数据透视表
#备注:数据分组之后会存在合并单元格
df_new=df_empty[‘指标值’].groupby([df_empty[‘开单分店’],df_empty[‘顾客姓名’]]).sum()
#数据拆分:拆分合并单元格
#为了满足数据分析的要求,需要将一列中多行合并单元格拆分成一个个的观测,并且每个观测的值与原来合并的值相等。
import openpyxl
#加载已数据分组的工作表(存在合并单元格)
workbook = openpyxl.load_workbook(r’C:\Users\HW\Desktop\练习.xlsx’)
name_list = workbook.sheetnames
worksheet = workbook[name_list[0]]
合并单元格的位置信息,可迭代对象(单个是一个’openpyxl.worksheet.cell_range.CellRange’对象),print后就是excel坐标信息
m_list = worksheet.merged_cells
cr = []
for m_area in m_list:
#合并单元格的起始行坐标、终止行坐标
r1, r2, c1, c2 = m_area.min_row, m_area.max_row, m_area.min_col, m_area.max_col
#纵向合并单元格的位置信息提取出
if r2 - r1 > 0:
cr.append((r1, r2, c1, c2))
print(‘符合条件%s’ % str(m_area))
#这里注意需要把合并单元格的信息提取出再拆分
for r in cr:
worksheet.unmerge_cells(start_row=r[0], end_row=r[1],
start_column=r[2], end_column=r[3])
for row in range(r[0], r[1]):
worksheet.cell(row=row+1, column=r[3], value=worksheet.cell(r[0], r[3]).value)
#获得一维表
workbook.save(‘data.xlsx’)
file_path=r’C:\Users\HW\Desktop\data.xlsx’
df=pd.read_excel(file_path)
df1=df[(df[‘开单分店’]==‘门店A’)&(df[‘指标值’]>1)]
df1.to_excel(“练习2.xls”)
感谢:/weixin_44788825/article/details/104526131?spm=1001..3001.5506