pandas透视表、排序、结果查询一次搞清

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')
  1. 透视表改名字后方便排序,如上:b.columns=[];
  2. 透视表仍是Dataframe格式,可以直接sort_values()排序;
  3. 对索引排序,需要先用reset_index()重置索引为数字索引(0,1,2,3。。。),原有的索引会变成列,直接用sort_values()里边添加索引转换后的列名即可;
  4. 步骤3操作添加reset_index则可以对排序结果重置数字索引;
  5. 步骤3操作添加set_index()则会还原为按索引聚合的情形,方便观看(但不方便筛选,因为会聚合后会有空白)。
  6. 结果展示如下,透视4:
  7. 透视5:
  8. 透视6:
  9. 透视7:
  10. 透视8:
  11. 对透视表结果的查询,用query()函数:
  12.  多条件查询用&连接:
  13.  df.query("not (Quantity == 95)") 获取不是95的所有行数据
  14. 使用Query()函数在日期时间值上进行查询的唯一要求是,包含这些值的列应为数据类型dateTime64 [ns],

    df["OrderDate"] = pd.to_datetime(df["OrderDate"], format="%Y-%m-%d")

  15. 获得八月份的所有记录

    df.query("OrderDate.dt.month == 8")

  16. 可以用in来查询:

  17. 用str.contains()可以实现like匹配,找到包含特定字符串的全部数据:

  18. 列重命名三种方法:一,重命名指定列

 二,全部重名名 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(‘空值’),然后再做透视,避免数据遗漏;

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值