【Python】用 Python 帮财务小妹生成 Excel 报表,小妹直说一辈子。。。

429964634ea4fbbbc12ca3515fb5bad4.png

财务小妹

萝卜哥,求助!

a95b9d6a0b47022a29e30a71d2db1364.png

人有三急,回见~

55e4d50a583b17cb1fce3cbe8bb0178f.png

1074282991f1169a0c15f678130bcb33.png

萝卜

57e92995d32fa55e4230506c93403bc3.png

财务小妹

别啊,不能去!

ef995f8a09e8949738fcae6dde3111b1.png

这,到底啥事啊

4c3e39a0a76940940e2e9b0b7ffcfdc0.png

d3eb7ee176df113e6c8db84fdf652a4a.png

萝卜

d4c3a7877cf5012d43e5d5341bec614b.png

财务小妹

有一个超级繁琐的事情,不过感觉你和Python能帮我

1cf9da9b88a25abb2c5d3b1c3e1d6a51.png

那你学Python吧,毕竟我也不能帮你一辈子

566f2085c67f7e7d325bf329026307a1.png

b505c503db010489a2837f76e0263bc2.png

萝卜

7423014d37d814e8c6674b977ce60e9f.png

财务小妹

不一定哦,先帮我把这次搞定,也许能一辈子呢

e12923081d75578f52622bdd933e7e32.png

当真?我来看看

a321b57fefc08eb4deb1284fbe892b18.png

d75f14061b63a29f3e52a4703b386330.png

萝卜

财务小妹的需求

有一个Excel数据,需要根据一定规则重新组合数据,并把不同的数据发给不同的人

原始数据:

4efd33288afaab6d7f5dcfdad8875c93.png

目的数据:

e9a87ff91811402cc8155d119e47527e.png

每一个tab页的数据,直接发给对应的人即可!

对于上面的数据格式转化,我们可以很自然的想到使用透视表,pivot table

然后为了达到更好的效果,我们还使用了 Pandas 当中的 DataFrame.xs 函数

先来进行透视表转换

df = pd.read_excel("sales-funnel.xlsx")
table = pd.pivot_table(df,index=["Manager","Rep","Product"],
               values=["Price","Quantity"],
               aggfunc=[np.sum,np.mean],fill_value=0)
 table

3cde34dc87e8de9ae50e28fce9b072fe.png

接下来应用 xs

table.xs('Debra Henley', level=0)

4ba41d170c1a80cf4a7e44a0b4dbba5b.png

可以看到很轻松的就拿到了 Debra Henley 对应的数据

我们还可以继续向下钻取数据

table.xs(('Debra Henley','Craig Booker'), level=0)

5cebc62a4df5e1949dc09e5298f4eabc.png

接下来我们还需要用到 get_level_values 函数

table.index.get_level_values(0)
table.index.get_level_values(1)
table.index.get_level_values(0).unique()

Output:

Index(['Debra Henley', 'Debra Henley', 'Debra Henley', 'Debra Henley',
       'Debra Henley', 'Debra Henley', 'Debra Henley', 'Fred Anderson',
       'Fred Anderson', 'Fred Anderson', 'Fred Anderson', 'Fred Anderson',
       'Fred Anderson'],
      dtype='object', name='Manager')
Index(['Craig Booker', 'Craig Booker', 'Craig Booker', 'Daniel Hilton',
       'Daniel Hilton', 'John Smith', 'John Smith', 'Cedric Moss',
       'Cedric Moss', 'Cedric Moss', 'Wendy Yule', 'Wendy Yule', 'Wendy Yule'],
      dtype='object', name='Rep')
Index(['Debra Henley', 'Fred Anderson'], dtype='object', name='Manager')

下面我们就可以写一个循环,依次获取到 manager 所需要的数据

for manager in table.index.get_level_values(0).unique():
    print(table.xs(manager, level=0))

c53ba719945d43a8d8b79ea3567ceedc.png

最后把数据保存到新的 Excel 当中

writer = pd.ExcelWriter('output.xlsx')


for manager in table.index.get_level_values(0).unique():
    temp_df = table.xs(manager, level=0)
    temp_df.to_excel(writer,manager)


writer.save()

由于上述操作都是在 Jupyter Notebook 当中进行的,下面我们把相关代码封装下,通过命令行来执行

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Script to generate sales report')
    parser.add_argument('infile', type=argparse.FileType('r'),
                        help="report source file in Excel")
    parser.add_argument('outfile', type=argparse.FileType('w'),
                        help="output file in Excel")
    args = parser.parse_args()
    # We need to pass the full file name instead of the file object
    sales_report = create_pivot(args.infile.name)
    save_report(sales_report, args.outfile.name)

至此,上述需求全部完成!

c26fb2402c6959783fe424153db879a6.png

财务小妹

哇,好棒哦~

4cecfef053aea9c70987f98181940b2c.png

嘿嘿,一般一般

ed65b6f91517472ddb1ea0627442f2e9.png

79223599050e6c4f8f68f74c8cb28b23.png

萝卜

11807a689aa3ad28a7a4aa0c03fd12c3.png

财务小妹

嗯嗯,那我先下班喽

a7241c87472566007725086ee34b9c41.png

好呀,话说咱们什么时候说说一辈子的事情

b791659c45c127ffdd5d536da1afc48b.png

3198d6b32a16bb6c6928d856b289c4c3.png

萝卜

27463e44bd941d79f5a20dbdcd7da128.png

财务小妹

没问题啊,咱们要做一辈子的同事

28fe417e59779b7cf147957ab66b41f4.png

。。。

bdef19ef3b9269b1798c3b8f159d0294.png

478d0af8214d33eb18a8ae85025ec1b3.png

萝卜

好了,今天就到这里了,为了帮忙抚平萝卜哥受伤的小心灵,点个再走吧

 
 
 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载黄海广老师《机器学习课程》视频课黄海广老师《机器学习课程》711页完整版课件

本站qq群955171419,加入微信群请扫码:

0b912fc3283bd34bdb001d9a4e54dca0.png

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值