用 Python 帮财务小妹合并 Excel,小妹二话不说直接。。。

简介: 用 Python 帮财务小妹合并 Excel,小妹二话不说直接。。。

财务小妹的需求


先合并几个内容类似的 Excel,在通过一个字段把另一个Excel文件的内容添加进来,然后自动进行 groupby 处理,最好还是要一个 GUI 页面,TM 要求真多!

微信图片_20220522145204.png


选择需要批量处理的 Excel 文件所在的目录和保存生成的新 Excel 的目录,以及那个需要 merge 进来的文件目录,点击 Start 按钮就可以自动完成


我们还是先看下测试数据

import pandas as pd
import numpy as np
import glob
glob.glob("./sales*.xlsx")

Output:

['.\\sales-feb-2014.xlsx', '.\\sales-jan-2014.xlsx', '.\\sales-mar-2014.xlsx']

上面的三个文件,就是我们需要合并的,那么合并代码比较简单,直接上

all_data = pd.DataFrame()
for f in glob.glob("./sales*.xlsx"):
    df = pd.read_excel(f)
    all_data = all_data.append(df,ignore_index=True)
all_data.head()

Output:

account number  name  sku  quantity  unit price  ext price  date
0  383080  Will LLC  B1-20000  7  33.69  235.83  2014-02-01 09:04:59
1  412290  Jerde-Hilpert  S1-27722  11  21.12  232.32  2014-02-01 11:51:46
2  412290  Jerde-Hilpert  B1-86481  3  35.99  107.97  2014-02-01 17:24:32
3  412290  Jerde-Hilpert  B1-20000  23  78.90  1814.70  2014-02-01 19:56:48
4  672390  Kuhn-Gusikowski  S1-06532  48  55.82  2679.36  2014-02-02 03:45:20


接下来还需要把数据中的时间转化为 pandas 的时间对象,一行代码


all_data['date'] = pd.to_datetime(all_data['date'])

然后我们来看需要 merge 的文件


status = pd.read_excel("./customer-status.xlsx")
status

Output:

account number  name  status
0  740150  Barton LLC  gold
1  714466  Trantow-Barrows  silver
2  218895  Kulas Inc  bronze
3  307599  Kassulke, Ondricka and Metz  bronze
4  412290  Jerde-Hilpert  bronze
5  729833  Koepp Ltd  silver
6  146832  Kiehn-Spinka  silver
7  688981  Keeling LLC  silver


接下来我们直接使用 pandas 的 merge 方法进行关联

all_data_st = pd.merge(all_data, status, how='left')
all_data_st.head()

Output:

 account number  name  sku  quantity  unit price  ext price  date  status
0  383080  Will LLC  B1-20000  7  33.69  235.83  2014-02-01 09:04:59  NaN
1  412290  Jerde-Hilpert  S1-27722  11  21.12  232.32  2014-02-01 11:51:46  bronze
2  412290  Jerde-Hilpert  B1-86481  3  35.99  107.97  2014-02-01 17:24:32  bronze
3  412290  Jerde-Hilpert  B1-20000  23  78.90  1814.70  2014-02-01 19:56:48  bronze
4  672390  Kuhn-Gusikowski  S1-06532  48  55.82  2679.36  2014-02-02 03:45:20  silver


可以看到两组数据关联成功了,但是对于某些账号 ,比如 737550 是没有 status 的

all_data_st[all_data_st["account number"]==737550].head()

Output:

account number  name  sku  quantity  unit price  ext price  date  status
15  737550  Fritsch, Russel and Anderson  S1-47412  40  51.01  2040.40  2014-02-05 01:20:40  NaN
25  737550  Fritsch, Russel and Anderson  S1-06532  34  18.69  635.46  2014-02-07 09:22:02  NaN
66  737550  Fritsch, Russel and Anderson  S1-27722  15  70.23  1053.45  2014-02-16 18:24:42  NaN
78  737550  Fritsch, Russel and Anderson  S2-34077  26  93.35  2427.10  2014-02-20 18:45:43  NaN
80  737550  Fritsch, Russel and Anderson  S1-93683  31  10.52  326.12  2014-02-21 13:55:45  NaN


对于这种数据,我们通过 fillna 函数处理下

all_data_st['status'].fillna('bronze',inplace=True)
all_data_st.head()

Output:

account number  name  sku  quantity  unit price  ext price  date  status
0  383080  Will LLC  B1-20000  7  33.69  235.83  2014-02-01 09:04:59  bronze
1  412290  Jerde-Hilpert  S1-27722  11  21.12  232.32  2014-02-01 11:51:46  bronze
2  412290  Jerde-Hilpert  B1-86481  3  35.99  107.97  2014-02-01 17:24:32  bronze
3  412290  Jerde-Hilpert  B1-20000  23  78.90  1814.70  2014-02-01 19:56:48  bronze
4  672390  Kuhn-Gusikowski  S1-06532  48  55.82  2679.36  2014-02-02 03:45:20  silver


现在所有的数据都是完整的了,我们可以进行最后的报告数据处理了

all_data_st["status"] = all_data_st["status"].astype("category")
all_data_st["status"].cat.set_categories(["gold", "silver", "bronze"], inplace=True)
result = all_data_st.groupby(["status"])["unit price"].agg([np.mean])
result

Output:

mean
status  
gold  53.723889
silver  57.272714
bronze  57.371163


最终的报告内容很简单,根据 status 分组,然后获取自动 unit price 的平均值


好了,数据处理完成,我们来编写 GUI 页面吧,这次我们使用的是 wxPython 库


pip install wxpython
pip install gooey


接下来创建一个 parse_args 函数来获取必要的输入信息

  • 数据目录
  • 输出目录
  • 账户状态文件
from argparse import ArgumentParser
parser = ArgumentParser(description='Create Quarterly Marketing Report')
parser.add_argument('data_directory',
                        action='store',
                        help="Source directory that contains Excel files")
parser.add_argument('output_directory',
                        action='store',
                        help="Output directory to save summary report")
parser.add_argument('cust_file',
                        action='store',
                        help='Customer Account Status File')
parser.add_argument('-d', help='Start date to include')
args = parser.parse_args()


当然我们很多时候,目录配置一次,下次就不再改变了,所以我们设置一个 json 文件来保存目录的配置信息

from argparse import ArgumentParser
def parse_args():
    """ Use ArgParser to build up the arguments we will use in our script
    Save the arguments in a default json file so that we can retrieve them
    every time we run the script.
    """
    stored_args = {}
    # get the script name without the extension & use it to build up
    # the json filename
    script_name = os.path.splitext(os.path.basename(__file__))[0]
    args_file = "{}-args.json".format(script_name)
    # Read in the prior arguments as a dictionary
    if os.path.isfile(args_file):
        with open(args_file) as data_file:
            stored_args = json.load(data_file)
    parser = ArgumentParser(description='Create Quarterly Marketing Report')
    parser.add_argument('data_directory',
                        action='store',
                        default=stored_args.get('data_directory'),
                        help="Source directory that contains Excel files")
    parser.add_argument('output_directory',
                        action='store',
                        default=stored_args.get('output_directory'),
                        help="Output directory to save summary report")
    parser.add_argument('cust_file',
                        action='store',
                        default=stored_args.get('cust_file'),
                        help='Customer Account Status File')
    parser.add_argument('-d', help='Start date to include',
                        default=stored_args.get('d'))
    args = parser.parse_args()
    # Store the values of the arguments so we have them next time we run
    with open(args_file, 'w') as data_file:
        # Using vars(args) returns the data as a dictionary
        json.dump(vars(args), data_file)
    return args


这样,我们就可以通过命令行来获取到相关需要传入的信息了

if __name__ == '__main__':
    conf = parse_args()
    print("Reading sales files")
    sales_df = combine_files(conf.data_directory)
    print("Reading customer data and combining with sales")
    customer_status_sales = add_customer_status(sales_df, conf.cust_file)
    print("Saving sales and customer summary data")
    save_results(customer_status_sales, conf.output_directory)
    print("Done")


接下来构建 GUI 页面

from gooey import Gooey
@Gooey(program_name="Create Quarterly Marketing Report")
def parse_args():
    """ Rest of program below
    """
    ...


Gooey 可以非常方便的构建页面,这样我们的一个简单 GUI 页面就完成了


微信图片_20220522150156.png


接下来我们做些优化,比如替换控件来支持文件路径选择等

parser.add_argument('data_directory',
                    action='store',
                    default=stored_args.get('data_directory'),
                    widget='DirChooser',
                    help="Source directory that contains Excel files")


这样,我们的小工具也就完成了,我们来看下效果


微信图片_20220522150202.png


生成的文件就在指定的目录下哦,完成!


相关文章
|
1月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
106 10
|
2天前
|
数据可视化 数据挖掘 大数据
1.1 学习Python操作Excel的必要性
学习Python操作Excel在当今数据驱动的商业环境中至关重要。Python能处理大规模数据集,突破Excel行数限制;提供丰富的库实现复杂数据分析和自动化任务,显著提高效率。掌握这项技能不仅能提升个人能力,还能为企业带来价值,减少人为错误,提高决策效率。推荐从基础语法、Excel操作库开始学习,逐步进阶到数据可视化和自动化报表系统。通过实际项目巩固知识,关注新技术,为职业发展奠定坚实基础。
|
2月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
125 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
30天前
|
机器学习/深度学习 前端开发 数据处理
利用Python将Excel快速转换成HTML
本文介绍如何使用Python将Excel文件快速转换成HTML格式,以便在网页上展示或进行进一步的数据处理。通过pandas库,你可以轻松读取Excel文件并将其转换为HTML表格,最后保存为HTML文件。文中提供了详细的代码示例和注意事项,帮助你顺利完成这一任务。
40 0
|
3月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
155 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
2月前
|
存储 数据可视化 Python
使用Python实现个人财务管理工具
本文介绍如何使用Python实现一个简单的个人财务管理工具,包括记录支出和收入、生成财务报告和数据可视化等功能。通过命令行界面输入数据,计算总支出、总收入和净收入,并使用Matplotlib库进行数据可视化。
116 1
|
3月前
|
Python
python读写操作excel日志
主要是读写操作,创建表格
70 2
|
3月前
|
索引 Python
Excel学习笔记(一):python读写excel,并完成计算平均成绩、成绩等级划分、每个同学分数大于70的次数、找最优成绩
这篇文章是关于如何使用Python读取Excel文件中的学生成绩数据,并进行计算平均成绩、成绩等级划分、统计分数大于70的次数以及找出最优成绩等操作的教程。
114 0
|
3月前
|
存储 Python
Python实战项目Excel拆分与合并——合并篇
Python实战项目Excel拆分与合并——合并篇
71 0
|
3月前
|
存储 Python 容器
Python实战项目:Excel拆分与合并
Python实战项目:Excel拆分与合并
56 0