pandas数据处理进阶详解


Posted in Python onOctober 11, 2019

一、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 转化为类别型数据 ,再 进行describe
detail.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 pd
res = 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 pd
import 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)
 
# 计算每个菜品的销售额 ,增加到detail
detail.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的sum
res = 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[:, '销量'] > 0
data = 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)

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

Python 相关文章推荐
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 Python
九步学会Python装饰器
May 09 Python
python 写的一个爬虫程序源码
Feb 28 Python
python操作字典类型的常用方法(推荐)
May 16 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
Dec 13 Python
Python实现合并两个有序链表的方法示例
Jan 31 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
在python里协程使用同步锁Lock的实例
Feb 19 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
通过Python编写一个简单登录功能过程解析
Sep 04 Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 #Python
树莓派安装OpenCV3完整过程的实现
Oct 10 #Python
树莓派极简安装OpenCv的方法步骤
Oct 10 #Python
python 利用jinja2模板生成html代码实例
Oct 10 #Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 #Python
利用pandas合并多个excel的方法示例
Oct 10 #Python
python匿名函数的使用方法解析
Oct 10 #Python
You might like
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
js动态为代码着色显示行号
2013/05/29 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
Three.js学习之几何形状
2016/08/01 Javascript
微信小程序 底部导航栏目开发资料
2016/12/05 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
python实现备份目录的方法
2015/08/03 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
python 弧度与角度互转实例
2020/04/15 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
尼克松手表官网:Nixon手表
2019/03/17 全球购物
您的时尚,您的生活方式:DTLR Villa
2019/12/25 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
大学毕业生通用自荐信范文
2013/10/31 职场文书
医科大学毕业生自荐信
2014/02/03 职场文书
个人授权委托书样本
2014/09/13 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
学生个人总结范文
2015/02/15 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书