← 可爱一天风物 | 代码

Python之实践(一)

· 发表评论

使用Python拆分表格

拆分表格是一件十分机械痛苦但有时又特别必要的事情。目前我了解两种比较讨巧的自动化处理方法:vba和python。
vba编码比较冗长且需要开启宏(excel默认关闭宏功能),python相对更加友好清晰,扩展性能更强。
以下是使用Python的方法记录,同时感谢部分网络源码贡献者。

工具

Sublime Text & Spyder

初始工作

首先导入pandas数据分析包。

import pandas as pd
from itertools import zip_longest
# 第二行代码作用是保证zip循环按照最长列表循环,非必要

定位路径

为了工作方便,导入OS模块定位目录。

import os
os.chdir("C:\\Users\\qiwei\\Desktop\\下发线索\\0408_0412\\")

读取该路径下的数据

df = pd.read_excel("轩辕线索4月5日-4月15日.xls",sheet_name = 0)

特殊情况

因为公司主营业务只覆盖湖南区域,而湘西、娄底、永州这3个城市及少数县市统一合为湘娄永大区,其他城市各自成立城市公司,长沙受理部分省外业务,因此需要构建湘娄永列表及长沙列表,重新将原本地区划分为新分区。

xly_list = ["湘西","湘西州","吉首","湘西自治州","湘西土家族苗族自治州","娄底","永州","浏阳","平江","汨罗","湘阴"]
cs_list = ["省外","外省"]
df["分区"] = df["地区"].copy()

for循环分区

使用for循环按照最长列表循环,分出湘娄永大区及长沙大区。
这里引入zip函数从2个序列中循环取一个元素作为新序列。由于xly_list及cs_list长度不一,zip默认按照最短序列循环会导致分区逻辑错误,所以需要在开始处引入zip_longest,使之按照最长序列循环,保证分区无误。

for x,y in zip_longest(xly_list,cs_list):
    df["分区"][df["地区"] == x] = "湘娄永";df["分区"][df["地区"] == y] = "长沙"

排序

将表格以"分区"为主要字段,"线索来源"为次要字段排序,替换原表。

df.sort_values(by = ["分区","来源"],inplace = True)

for循环分表

构建新的分区透视,使用set方法构建一个无序且不重复的集合,之后转化为列表,area_list即所有分区的一个合集。
使用for循环结合层次化索引,不断选中循环的分区,写入excel文件保存分表。

area_list=list(set(df["分区"]))
for i in area_list:
    newdf = df[df["分区"] == i]
    writer = pd.ExcelWriter("C:\\Users\\qiwei\\Desktop\\下发线索\\0408_0412\\%s0405_0415轩辕线索.xlsx" %i,engine = "xlsxwriter")
    newdf.to_excel(writer,sheet_name = i,index = False)
    writer.save()

再次使用同样的方法构建排序后的总表便于记录。

writer_total = pd.ExcelWriter("C:\\Users\\qiwei\\Desktop\\下发线索\\0408_0412\\总表汇总线索.xlsx",engine = "xlsxwriter")
df.to_excel(writer_total,sheet_name = "总表",index = False)
writer_total.save()

输出明细

最后为了核对和避免错漏,可以在Spyder输出明细,包括总条数及各个分表条数。

count_total = len(df)
count = df["分区"].value_counts()
print("\n\n总计%s条完成!明细如下:\n\n%s" %(count_total,count))

完整代码

# -*- coding: utf-8 -*-

import pandas as pd
from itertools import zip_longest

import os
os.chdir("C:\\Users\\qiwei\\Desktop\\下发线索\\0408_0412\\")
# 工作路径

df = pd.read_excel("轩辕线索4月5日-4月15日.xls",sheet_name = 0)
# 读取数据

xly_list = ["湘西","湘西州","吉首","湘西自治州","湘西土家族苗族自治州","娄底","永州","浏阳","平江","汨罗","湘阴"]
cs_list = ["省外","外省"]
df["分区"] = df["地区"].copy()
# 初步处理

for x,y in zip_longest(xly_list,cs_list):
    df["分区"][df["地区"] == x] = "湘娄永";df["分区"][df["地区"] == y] = "长沙"
# 替换区域

df.sort_values(by = ["分区","来源"],inplace = True)
# 排序

area_list=list(set(df["分区"]))
for i in area_list:
    newdf = df[df["分区"] == i]
    writer = pd.ExcelWriter("C:\\Users\\qiwei\\Desktop\\下发线索\\0408_0412\\%s0405_0415轩辕线索.xlsx" %i,engine = "xlsxwriter")
    newdf.to_excel(writer,sheet_name = i,index = False)
    writer.save()
# 保存分表

writer_total = pd.ExcelWriter("C:\\Users\\qiwei\\Desktop\\下发线索\\0408_0412\\总表汇总线索.xlsx",engine = "xlsxwriter")
df.to_excel(writer_total,sheet_name = "总表",index = False)
writer_total.save()
# 保存总表

count_total = len(df)
count = df["分区"].value_counts()
# 概览

print("\n\n总计%s条完成!明细如下:\n\n%s" %(count_total,count))

# Python, Excel, Data


评论已关闭

歌曲封面
0:00