本篇是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数据透视表基本相同,无法实现可视化操作但是数据读取速度更快,运行效率更高。工具无有高下之分,只有适用与否。
来源:CSDN
作者:公孙长乐
链接:https://blog.csdn.net/z1272578750/article/details/104023180