python数据分析&办公自动化实战(四):数据聚合计算、表链接及透视表

試著忘記壹切 提交于 2020-01-28 07:16:39

本篇是python数据分析实战笔记的第四篇,主要内容包括数据汇总处理、表与表之间连接及实现数据透视表,涉及groupby、merge、pivot_table及value_counts等值操作的函数,以代码+注释+总结形式展示。
任务目标:根据新签商家名单匹配商家损益情况
任务拆解:生成新签商家名单,根据商家名单与当月全量的商家损益表做关键字匹配,输出以特定维度汇总的经营结果

代码展示

df1 = pd.read_excel(doc1,encoding = "gbk")
df2 = pd.read_excel(doc2,encoding = "gbk")
df3 = pd.merge(df1,df2.loc[:,["月份","商家名称","省区","收入不含税"]],on=["月份","商家名称","省区"],how="left")
df3.groupby(["商家名称"]).sum().reset_index().to_excel("新签客户收入情况_11月.xlsx",encoding = "gbk")
df4 = pd.pivot_table(df3,values="收入不含税",columns="月份",index="省区",aggfunc="sum").reset_index()

代码拆解
首先,生成新签商家步骤暂未找到很好的实现方式,预想的方法是以当月商家名单对以往商家名单做循环判断,输出一个值为是否的矩阵,选取从未出现在以往商家明细中的名单;如果有哪位大佬通过代码实现了,请留言指教。
第二步是读取文件,见前文不赘述;
第三步是通过merge函数进行匹配,类似于数据库中建立表跟表之间的关系。

df3 = pd.merge(df1,df2.loc[:,["月份","商家名称","省区","收入不含税"]],on=["月份","商家名称","省区"],how="left")

merge为表合并函数,类似于数据库join操作;
on=关键字key,若字段不统一用left_on&right_on;
how为合并方式,与数据库通用,分left,right,inner,outer四种方式;左右相同,输出主表全部与从表与之匹配的部分;inner输出两表交集,outer输出并集,缺少数据的部分以空值填充;
df2.loc[:,["a","b"]]实现了只摘取特定列进行匹配,配合关键字可以实现不出现重复的列(如月份_X,月份_y)

第四步是汇总输出,使用groupby()函数实现汇总;

df3.groupby(["商家名称"]).sum().reset_index().to_excel("新签客户收入情况_11月.xlsx",encoding = "gbk")
#groupby 的用法为:groupby(以某列进行合并).值计算的方式
pandas中支持的值的计算方式包括:

 - 加减乘除算术运算
 - 是否逻辑判断
 - sum() 求和 、count()  计数
 - value_counts()  汇总计数
 - max() 最大值、min() 最小值
 - mean() 平均数、median() 中位数、mode() 众数
 - var() 方差、std() 标准差
 - quantile() 求四分位数,参数为0.25 或 0.75

本例中仅为按单个字段进行单一运算,groupby()还支持多种运算方式:

df.groupby(["月份","商家名称"])["收入"].sum()
#按月份、商家名称对收入列进行汇总求和
df.groupby(["月份","商家名称"]).aggregate({"子账号":"count","收入":"sum"})
#按月份、商家名称,对收入列进行汇总求和,对子账号进行汇总计数

另外,groupby()所得的结果并非标准的DataFrame形式,而是类似于:

columns 月份 收入
商家
a 1月 收入
2月 收入
b 1月 收入

因此对于此类表需要重新设置索引reset_index()

关于groupby()更深层次的了解参见《python数据分析》的第十章。

第五步是制作数据透视表

df4 = pd.pivot_table(df3,values="收入不含税",columns="月份",index="省区",aggfunc="sum").reset_index()
pivot_table()的参数:
data,数据所在的表格;values,值;columns,列;index,行;aggfunc,对值的计算方式;
fill_value,对空值的填充方式,默认为None;margins,是否显示合计,True or False;margins_value,合计列的列名
dropna是否缺失,如果为真则把整行全作为缺失值删除;

需要提及的是,pivot_table()输出的是二维表,与DataFrame中的一维表不同,其余操作与excel数据透视表基本相同,无法实现可视化操作但是数据读取速度更快,运行效率更高。工具无有高下之分,只有适用与否。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!