b=pd.pivot_table(df,index=['dashboard_title','username'],values='pv',aggfunc=['sum','max'],sort=True)
b.columns=['cishu','zuida']
b.sort_values('cishu',ascending=False).to_excel(pathstart+'toushi4.xlsx')
b.to_excel(pathstart+'toushi5.xlsx')
b.reset_index().sort_values(['dashboard_title','cishu'],ascending=[1,0]).to_excel(pathstart+'toushi6.xlsx')
b.reset_index().sort_values(['dashboard_title','cishu'],ascending=[1,0]).reset_index().to_excel(pathstart+'toushi7.xlsx')
b.reset_index().sort_values(['dashboard_title','cishu'],ascending=[1,0]).set_index(['dashboard_title','username']).to_excel(pathstart+'toushi8.xlsx')
- 透视表改名字后方便排序,如上:b.columns=[];
- 透视表仍是Dataframe格式,可以直接sort_values()排序;
- 对索引排序,需要先用reset_index()重置索引为数字索引(0,1,2,3。。。),原有的索引会变成列,直接用sort_values()里边添加索引转换后的列名即可;
- 步骤3操作添加reset_index则可以对排序结果重置数字索引;
- 步骤3操作添加set_index()则会还原为按索引聚合的情形,方便观看(但不方便筛选,因为会聚合后会有空白)。
- 结果展示如下,透视4:
- 透视5:
- 透视6:
- 透视7:
- 透视8:
- 对透视表结果的查询,用query()函数:
- 多条件查询用&连接:
- df.query("not (Quantity == 95)") 获取不是95的所有行数据
- 使用Query()函数在日期时间值上进行查询的唯一要求是,包含这些值的列应为数据类型dateTime64 [ns],
df["OrderDate"] = pd.to_datetime(df["OrderDate"], format="%Y-%m-%d")
-
获得八月份的所有记录
df.query("OrderDate.dt.month == 8")
-
可以用in来查询:
- 用str.contains()可以实现like匹配,找到包含特定字符串的全部数据:
- 列重命名三种方法:一,重命名指定列
二,全部重名名 df.columns=['','','',...],三,修改一部分列名,
df.columns = df.columns.str.replace('动物', '爬行动物')
分析完整案例代码:
import pandas as pd
import numpy as np
pathstart='/Users/kangyongqing/Documents/kangyq/202303/分析模版/Superset看板浏览量分析/'
path1=pathstart+'20230306_100429.csv'
df=pd.read_csv(path1)
print(df.columns)
table=df.pivot_table(index=['dashboard_title','username'],values='pv',aggfunc=('sum','max','count'))
print(table.shape)
table.reset_index().sort_values(['dashboard_title','sum'],ascending=[1,0]).set_index(['dashboard_title','username']).rename(columns={'count':'月活跃天数','max':'单天最大活跃次数','sum':'月度累计活跃次数'}).to_excel(pathstart+'公司看板分析.xlsx')
table1=table.reset_index()
table1[table1['dashboard_title'].str.contains('教学部')].sort_values(['dashboard_title','sum'],ascending=[1,0]).set_index(['dashboard_title','username']).rename(columns={'count':'月活跃天数','max':'单天最大活跃次数','sum':'月度累计活跃次数'}).to_excel(pathstart+'教学部看板分析.xlsx')
df.pivot_table(index='username',values='pv',aggfunc=('sum','max','count')).sort_values('sum',ascending=False).rename(columns={'count':'月活跃天数&看板数','max':'单天最大活跃次数','sum':'月度累计活跃次数'}).to_excel(pathstart+'公司最热用户分析.xlsx')
df.pivot_table(index='dashboard_title',values='pv',aggfunc=('sum','max','count')).sort_values('sum',ascending=False).rename(columns={'count':'月活跃天数&人次','max':'单天单人最大活跃次数','sum':'月度累计活跃次数'}).to_excel(pathstart+'公司最热看板分析.xlsx')
df[df['dashboard_title'].str.contains('教学部')].pivot_table(index='username',values='pv',aggfunc=('sum','max','count')).sort_values('sum',ascending=False).rename(columns={'count':'月活跃天数&看板数','max':'单天单人最大活跃次数','sum':'月度累计活跃次数'}).to_excel(pathstart+'教学部最热用户分析.xlsx')
df[df['dashboard_title'].str.contains('教学部')].pivot_table(index='dashboard_title',values='pv',aggfunc=('sum','max','count')).sort_values('sum',ascending=False).rename(columns={'count':'月活跃天数&人次','max':'单天单人最大活跃次数','sum':'月度累计活跃次数'}).to_excel(pathstart+'教学部最热看板分析.xlsx')
19.透视表去重统计
pvt=dt.pivot_table(index='来源',values='学生id',aggfunc='count',margins=True,margins_name='总计')
#计数
upvt=dt.pivot_table(index='来源',values='学生id',aggfunc=lambda x:len(x.unique()),fill_value=0,margins=True,margins_name='总计')
#去重计数
结果展示:
20、pandas导入数据时转换数据格式进行运算:
from datetime import datetime,timedelta
dt=pd.read_excel(dpath,dtype={'时间':'datetime64'})
# dt['时间']=dt['时间'].astype('datetime64')
dt['sevendaybefore']=dt['时间']-timedelta(7)
时间格式默认导入的是str格式,可以用dtype在导入时设置或者导入后用as_type来转换,转换成时间格式之后,就可以进行时间的运算
21、透视表作图汉字显示:
from matplotlib.font_manager import FontProperties
font=FontProperties(fname='/System/Library/Fonts/Supplemental/Arial Unicode.ttf',size=10)
#找到本机font中文字体
plt.xticks(pvt_source.index,fontproperties=font)
#在需要显示汉字的地方设置即可
22、数据透视表中的索引,如果有多个,其中任何一个为空值,则该项不会在结果中展示,可以fillna(‘空值’),然后再做透视,避免数据遗漏;
23、索引指定排序:
如图所示,想让S排在最上方,可以如下方法实现:
#根据索引特征,按指定索引排序
piv1=piv1.reset_index().set_axis([1,2,3,0],axis=0)
piv1=piv1.sort_index()
即可实现
24、日期列按月聚合透视,pd.Grouper(key='',freq='')
df1['firdate']=pd.to_datetime(df1['firdate'])
df1['lastdate']=pd.to_datetime(df1['lastdate'])
#MS按月初1号做汇总,ME按月末30号或者31号进行汇总
piv1=pd.pivot_table(df1,index=pd.Grouper(key='firdate',freq='MS'),values='student_id',aggfunc='count').rename(columns={'student_id':'新学员数'}).reset_index()
输出结果: