侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

pandas数据处理进阶详解

技术  /  管理员 发布于 7年前   168

一、pandas的统计分析

1、关于pandas 的数值统计(统计detail 中的 单价的相关指标)

import pandas as pd # 加载数据detail = pd.read_excel("./meal_order_detail.xlsx")print("detail :\n", detail) print("detail 的列索引名称:\n", detail.columns)print("detail 的形状:\n", detail.shape)print("detail 数据类型:\n", detail.dtypes)  print("amounts 的最大值:\n",detail.loc[:,'amounts'].max())print("amounts 的最小值:\n",detail.loc[:,'amounts'].min())print("amounts 的均值:\n",detail.loc[:,'amounts'].mean())print("amounts 的中位数:\n",detail.loc[:,'amounts'].median())print("amounts 的方差:\n",detail.loc[:,'amounts'].var())print("amounts 的describe:\n",detail.loc[:,'amounts'].describe())# 对于两列的统计结果print("amounts 的describe:\n",detail.loc[:,['counts','amounts']].describe())print("amounts 的describe:\n",detail.loc[:,['counts','amounts']].describe())print("amounts 的describe:\n",detail.loc[:,'amounts'].describe())print("amounts 的describe:\n",detail.loc[:,'counts'].describe())print("amounts 的极差:\n",detail.loc[:,'amounts'].ptp())print("amounts 的标准差:\n",detail.loc[:,'amounts'].std())print("amounts 的众数:\n",detail.loc[:,'amounts'].mode()) # 返回众数的数组print("amounts 的众数:\n",detail.loc[:,'counts'].mode()) # 返回众数的数组print("amounts 的非空值的数目:\n",detail.loc[:,'amounts'].count())print("amounts 的最大值的位置:\n",detail.loc[:,'amounts'].idxmax()) # np.argmax()print("amounts 的最小值的位置:\n",detail.loc[:,'amounts'].idxmin()) # np.argmin()

2、pandas对于非数值型数据的统计分析

(1)对于dataframe转化数据类型,其他类型 转化为object类型

detail.loc[:,'amounts'] = detail.loc[:,'amounts'].astype('object')

(2)类别型数据

detail.loc[:,'amounts'] = detail.loc[:,'amounts'].astype('category')print("统计类别型数据的describe指标:\n",detail.loc[:, 'amounts'].describe())

(3)统计实例

## 在detail中 哪些菜品最火?菜品卖出了多少份?# 若白饭算菜detail.loc[:, 'dishes_name'] = detail.loc[:, 'dishes_name'].astype('category')print("按照dishes_name统计描述信息:\n", detail.loc[:, 'dishes_name'].describe()) # 若白饭不算菜 ---把白饭删除,再统计# drop labels ---行的名称, axis =0,inplace = True# 行的名称??? 怎么获取----bool值# 定位到白饭的行bool_id = detail.loc[:, 'dishes_name'] == '白饭/大碗' # 进行 获取行名称index = detail.loc[bool_id, :].index # 进行删除detail.drop(labels=index, axis=0, inplace=True) # 在进行转化类型detail.loc[:, 'dishes_name'] = detail.loc[:, 'dishes_name'].astype('category') # 在进行统计描述信息print("按照dishes_name统计描述信息:\n", detail.loc[:, 'dishes_name'].describe()) # 看 在detail 中那个订单点的菜最多,点了多少份菜?# 将 order_id 转化为类别型数据 ,再 进行describedetail.loc[:, 'order_id'] = detail.loc[:, 'order_id'].astype("category")# 统计描述print("按照order_id统计描述信息为:\n", detail.loc[:, 'order_id'].describe())

二、pandas时间数据

  • datetime64[ns] ---numpy 里面的时间点类
  • Timestamp ---pandas 默认的时间点类型----封装了datetime64[ns]
  • DatetimeIndex ---pandas 默认支持的时间序列结构

1、可以通过 pd.to_datetime 将时间点数据转化为pandas默认支持的时间点数据

res = pd.to_datetime("2016/01/01")print("res:\n",res)print("res 的类型:\n",type(res))

 2、时间序列转化 --可以通过pd.to_datetime 或者pd.DatetimeIndex将时间序列转化为pandas默认支持的时间序列结构

res = pd.to_datetime(['2016-01-01', '2016-01-01', '2016-01-01', '2011-01-01'])res1 = pd.DatetimeIndex(['2016-01-01', '2016-01-02', '2016-02-05', '2011-09-01'])print("res:\n", res)print("res 的类型:\n", type(res)) print("res1:\n", res1)print("res1 的类型:\n", type(res1))

3、

import pandas as pd# #加载数据detail = pd.read_excel("./meal_order_detail.xlsx")# print("detail :\n",detail)print("detail 的列索引名称:\n", detail.columns)print("detail 的形状:\n", detail.shape)# print("detail 数据类型:\n",detail.dtypes)print("*" * 80)# 获取place_order_time列print(detail.loc[:, 'place_order_time']) # 转化为pandas默认支持的时间序列结构detail.loc[:, 'place_order_time'] = pd.to_datetime(detail.loc[:, 'place_order_time']) # print(detail.dtypes)print("*" * 80) # 获取该时间序列的属性---可以通过列表推导式来获取时间点的属性year = [i.year for i in detail.loc[:, 'place_order_time']]print("年:\n", year) month = [i.month for i in detail.loc[:, 'place_order_time']]print("月:\n", month) day = [i.day for i in detail.loc[:, 'place_order_time']]print("日:\n", day) quarter = [i.quarter for i in detail.loc[:, 'place_order_time']]print("季度:\n", quarter) # 返回对象weekday = [i.weekday for i in detail.loc[:, 'place_order_time']]print("周几:\n", weekday) weekday_name = [i.weekday_name for i in detail.loc[:, 'place_order_time']]print("周几:\n", weekday_name) is_leap_year = [i.is_leap_year for i in detail.loc[:, 'place_order_time']]print("是否闰年:\n", is_leap_year)

4、时间加减

import pandas as pdres = pd.to_datetime("2016-01-01")print("res:\n", res)print("res 的类型:\n", type(res)) print("时间推后一天:\n", res + pd.Timedelta(days=1))print("时间推后一小时:\n", res + pd.Timedelta(hours=1)) detail.loc[:, 'place_over_time'] = detail.loc[:, 'place_order_time'] + pd.Timedelta(days=1)print(detail) ## 时间差距计算res = pd.to_datetime('2019-10-9') - pd.to_datetime('1996-11-07')print(res)

5、获取本机可以使用的最初时间 和最后使用的时间节点

print(pd.Timestamp.min)print(pd.Timestamp.max)

三、分组聚合

import pandas as pdimport numpy as np # 加载数据users = pd.read_excel("./users.xlsx")print("users:\n", users)print("users 的列索引:\n", users.columns)print("users 的数据类型:\n", users.dtypes) # 根据班级分组、统计学员的班级的平均年龄# groupby 分组# by ---指定分组的列,可以是单列 也可以是多列# res = users.groupby(by='ORGANIZE_NAME')['age'].mean()# 按照单列进行分组,统计多个列的指标# res = users.groupby(by='ORGANIZE_NAME')[['age','USER_ID']].mean()res = users.groupby(by=['ORGANIZE_NAME', 'poo', 'sex'])['age'].mean()print(res) # 利用agg# 进行同时对age 求平均值、对userid 求最大值# 只需要指定 np.方法名print(users.agg({'age': np.mean, 'USER_ID': np.max})) # 对age 和 USER_ID 同时分别求 和 和均值print(users[['age', 'USER_ID']].agg([np.sum, np.mean])) # 对age USER_ID 求取不同个数的统计指标print(users.agg({'age': np.min, 'USER_ID': [np.mean, np.sum]}))  def hh(x): return x + 1  # 自定义函数进行计算# res = users['age'].apply(hh)# res = users[['age','USER_ID']].apply(lambda x:x+1)res = users['age'].transform(lambda x: x + 1)# 不能进行跨列的运算print(res)

四、透视表与交叉表

import pandas as pd # 加载数据detail = pd.read_excel("./meal_order_detail.xlsx")print("detail :\n", detail)print("detail 的列名:\n", detail.columns)print("detail 的数据类型:\n", detail.dtypes) # 获取时间点的日属性# 必须pandas默认支持的时间序列类型detail.loc[:, 'place_order_time'] = pd.to_datetime(detail.loc[:, 'place_order_time']) # 以列表推导式来获取日属性detail.loc[:, 'day'] = [i.day for i in detail.loc[:, 'place_order_time']] # 透视表 是一种plus 版的分组聚合# 创建一个透视表# data dataframe数据# values 最终统计指标所针对对象,要关心的数据主体# index --按照index 进行行分组# columns ---按照columns进行列分组# aggfunc ---对主体 进行什么指标的统计 # res = pd.pivot_table(data=detail[['amounts','order_id','counts','dishes_name','day']],values='amounts',columns=['day','counts'],index=['order_id','dishes_name'],aggfunc='mean',margins=True)# # print(res)# res.to_excel("./hh.xlsx") # 交叉表 mini版的透视表# 如果只传index 与columns 统计这两列的相对个数# res = pd.crosstab(index=detail['counts'],columns=detail['amounts'])# values 必须和aggfunc同时存在res = pd.crosstab(index=detail['order_id'],columns=detail['counts'],values=detail['amounts'],aggfunc='mean')print(res)

五、案例

1、营业额案例

import pandas as pd # detail 有时间数据 # 加载数据detail = pd.read_excel("./meal_order_detail.xlsx")print("detail :\n", detail)print("detail 的列名:\n", detail.columns)print("detail 的数据类型:\n", detail.dtypes) # 计算每个菜品的销售额 ,增加到detaildetail.loc[:, 'pay'] = detail.loc[:, 'counts'] * detail.loc[:, 'amounts'] # print(detail) # 获取时间点的日属性# 必须pandas默认支持的时间序列类型detail.loc[:, 'place_order_time'] = pd.to_datetime(detail.loc[:, 'place_order_time']) # 以列表推导式来获取日属性detail.loc[:, 'day'] = [i.day for i in detail.loc[:, 'place_order_time']]# print(detail)# 以 日 为分组 ,统计pay的sumres = detail.groupby(by='day')['pay'].sum()print(res)# print(type(res)) df = pd.DataFrame(res.values, columns=['monty'], index=res.index)print(df)print(type(df))

 2、连锁超市案例

import pandas as pd # 加载数据order = pd.read_csv("./order.csv", encoding='ansi')print("order:\n", order)print("order 的列索引:\n", order.columns) # 1、哪些类别的商品比较畅销?# 剔除销量 < 0 的数据 (保留销量 >0 的数据)# 保存bool_id = order.loc[:, '销量'] > 0data = order.loc[bool_id, :] # 剔除异常数据之后的正常数据 print(data.shape)print("*" * 80) # 删除异常# bool_id = order.loc[:,'销量'] <= 0# index = order.loc[bool_id,:].index## data = order.drop(labels=index,axis=0,inplace=False) # 按照类别进行分组,统计销量的 和# 进行dataframe或者series的值排序# 如果series sort_values()直接按照seies的值进行排序# 如果df 那么需要指定 按照哪一列进行排序,by= 列名 # 默认是升序ascending=True# ascending=False 降序# res = data.groupby(by='类别ID')['销量'].sum().sort_values(ascending=False)## print(res) # 2、哪些商品比较畅销?# 分组聚合实现# res = data.groupby(by='商品ID')['销量'].sum().sort_values(ascending=False).head(10)## print(res) # 透视表实现# res = pd.pivot_table(data=data.loc[:, ['商品ID', '销量']], index='商品ID', values='销量', aggfunc='sum').sort_values(by='销量',#    ascending=False).head(#  10)# print(res)  # 3、求不同门店的销售额占比# 提示:订单中没有销售额字段,所有需要新增一个销售额字段。增加字段后按照门店编号进行分组,然后计算占比。 # # 先计算销售额# data.loc[:,'销售额'] = data.loc[:,'单价'] * data.loc[:,'销量']## # 按照门店编号进行分组统计销售额的sum# res = data.groupby(by='门店编号')['销售额'].sum()# # print(res)# # 计算所有的销售额总和# all_ = res.sum()## # print(all_)# per_ = res / all_## print("各个门店的销售额占比为:\n",per_.apply(lambda x:format(x,".2%"))) # a = 100.105# print("%.2f"%a) # print("{}%".format(2.0)) # 匿名函数# print(lambda x:x+5) ### def add(x):# #  return x+5 # 4、哪段时间段是超市的客流高峰期?# 提示:需要知道每个时间段对应的客流量,但是订单表中既有日期又有时间,我们需要从中提出小时数,这里利用订单ID去重计数代表客流量。 # 先对订单去重# subset 去重的那一列 的列名,可以是多列,多列的时候传列表data.drop_duplicates(subset='订单ID', inplace=True) # print(data.shape) # 按照小时分组对订单ID进行统计数量 # 将成交时间转化为 pandas默认支持的时间序列类型data.loc[:, '成交时间'] = pd.to_datetime(data.loc[:, '成交时间']) # 获取小时属性,增加到data 中 data.loc[:, 'hour'] = [i.hour for i in data.loc[:, '成交时间']] # print(data) # 按照hour 分组 统计 订单ID数量 res = data.groupby(by='hour')['订单ID'].count().sort_values(ascending=False) print(res)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    使用turtle绘制五角星、分形树
    下一条:
    结合OpenCV与TensorFlow进行人脸识别的实现
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客