社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

机器学习初学者 • 4 年前 • 622 次点击  

财务小妹

萝卜哥,求助!

人有三急,回见~

萝卜


财务小妹

别啊,不能去!

这,到底啥事啊

萝卜

财务小妹

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

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

萝卜

财务小妹

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

当真?我来看看

萝卜

财务小妹的需求


“

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

”


原始数据:



目的数据:



每一个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


接下来应用 xs

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


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


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

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


接下来我们还需要用到 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))


最后把数据保存到新的 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)


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


财务小妹

哇,好棒哦~

嘿嘿,一般一般

萝卜


财务小妹

嗯嗯,那我先下班喽

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

萝卜


财务小妹

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

。。。

萝卜


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


往期精彩 回顾




本站qq群955171419,加入微信群请扫码:
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/124081