有一个Excel数据,需要根据一定规则重新组合数据,并把不同的数据发给不同的人
”原始数据:
目的数据:
每一个tab页的数据,直接发给对应的人即可!
对于上面的数据格式转化,我们可以很自然的想到使用透视表,pivot table
然后为了达到更好的效果,我们还使用了 Pandas 当中的 DataFrame.xs 函数
先来进行透视表转换
代码语言:javascript复制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
代码语言:javascript复制table.xs('Debra Henley', level=0)
可以看到很轻松的就拿到了 Debra Henley 对应的数据
我们还可以继续向下钻取数据
代码语言:javascript复制table.xs(('Debra Henley','Craig Booker'), level=0)
接下来我们还需要用到 get_level_values 函数
代码语言:javascript复制table.index.get_level_values(0)
table.index.get_level_values(1)
table.index.get_level_values(0).unique()
Output:
代码语言:javascript复制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')
代码语言:javascript复制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')
代码语言:javascript复制Index(['Debra Henley', 'Fred Anderson'], dtype='object', name='Manager')
下面我们就可以写一个循环,依次获取到 manager 所需要的数据
代码语言:javascript复制for manager in table.index.get_level_values(0).unique():
print(table.xs(manager, level=0))
最后把数据保存到新的 Excel 当中
代码语言:javascript复制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 当中进行的,下面我们把相关代码封装下,通过命令行来执行
代码语言:javascript复制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)
至此,上述需求全部完成!