财务小妹
萝卜哥,求助!
人有三急,回见~
萝卜
财务小妹
别啊,不能去!
这,到底啥事啊
萝卜
财务小妹
有一个超级繁琐的事情,不过感觉你和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)
至此,上述需求全部完成!
财务小妹
哇,好棒哦~
嘿嘿,一般一般
萝卜
财务小妹
嗯嗯,那我先下班喽
好呀,话说咱们什么时候说说一辈子的事情
萝卜
财务小妹
没问题啊,咱们要做一辈子的同事
。。。
萝卜
好了,今天就到这里了,为了帮忙抚平萝卜哥受伤的小心灵,点个赞再走吧