记录研究生封校生活的学习day8(第四篇)pandas实战(四)

105 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

总计:今天是十月更文计划第八天,第十五篇

使用透视表与交叉表查看业绩汇总数据

(1)透视表

透视表用来根据一个或多个键进行聚合,把数据分散到对应的行和列上去,是数据分析常用技术之一。

pivot(index=None, columns=None, values=None)

参数index用来指定使用哪一列数据作为结果DataFrame的索引;

参数columns用来指定哪一列数据作为结果DataFrame的列名;

参数values用来指定哪一列数据作为结果DataFrame的值。

pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')

参数values、index、columns的含义与DataFrame结构的pivot()方法一样;

参数aggfunc用来指定数据的聚合方式,例如求平均、求和、求中值等;

参数margins用来指定是否显示边界以及边界上的数据;

参数margins_name用来指定边界数据的索引名称和列名;

参数dropna用来指定是否丢弃缺失值。

(2)交叉表

交叉表是一种特殊的透视表,往往用来统计频次,也可以使用参数aggfunc指定聚合函数实现其他功能。

crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)

参数values、index、columns的含义与DataFrame结构的pivot()方法一样;

参数aggfunc用来指定聚合函数,默认为统计次数;

参数rownames和colnames分别用来指定行索引和列索引的名字,如果不指定则直接使用参数index和columns指定的列名。

df = pd.read_excel(r'超市营业额2.xlsx')

print('查看每人每天交易总额'.ljust(20,'='))
dff = df.groupby(by=['姓名','日期'], as_index=False).sum()     #按照“姓名”和“日期”进行分组,并且“姓名”和“日期”不做为索引,其他数据进行求和
# 数据量太大,为减少篇幅占用,只输出前5天的数据
dff = dff.pivot(index='姓名', columns='日期', values='交易额')  #调用Pivot返回一个透视表,以“姓名”做索引,以“日期”做列,以“交易额”做值
print(dff.iloc[:,:5])    #切片输出前5列

print('交易总额低于5万元的员工前5天业绩'.ljust(20,'='))
print(dff[dff.sum(axis=1)<50000].iloc[:,:5])   #对刚才的dff表,按照行(axis=1)进行求和,如果,50000,则输出前5列

print('交易总额低于5万元的员工姓名'.ljust(20,'='))
print(dff[dff.sum(axis=1)<50000].index.values)   #索引的值,就是姓名那一列的值



print('使用pivot_table()方法实现'.ljust(20,'='))
# 如果把只显示前5列的限制去掉,会发现最后还有一个名字为ALL的列
print(df.pivot_table(values='交易额', index='姓名', columns='日期', aggfunc='sum',margins=True).iloc[:,:5])   #聚合方式是求和,margins=True会在边界多一个all

print('查看每人在各柜台的交易总额'.ljust(20,'='))
dff = df.groupby(by=['姓名','柜台'], as_index=False).sum()
print(dff.pivot(index='姓名', columns='柜台', values='交易额'))

print('查看每人每天的上班次数'.ljust(20,'='))
print(df.pivot_table(values='交易额', index='姓名', columns='日期', aggfunc='count',margins=True).iloc[:,:5])

print('查看每人在各柜台的上班次数'.ljust(20,'='))
print(df.pivot_table(values='交易额', index='姓名', columns='柜台', aggfunc='count',margins=True))

输出的结果如下:

image.png