pandas的统计分析与分组聚合

​ 统计分析是数据分析重要的组成部分,它几乎贯穿了整个数据分析的流程。应用统计方法,将定量与定性结合,进行的研究活动叫统计分析。统计分析除了包含单一数值型特征的数据集中趋势、离散趋势和峰度与偏度等统计知识外,还包含了多个特征比较计算等知识。

统计分析

pandas的数值类型统计
# pandas的数值类型统计
print("amounts 的最大值:\n",data.loc[:,'amounts'].max())
print("amounts 的最小值:\n",data.loc[:,'amounts'].min())
print("amounts 的均值:\n",data.loc[:,'amounts'].mean())
print("amounts 的中位数:\n",data.loc[:,'amounts'].median())
print("amounts 的方差:\n",data.loc[:,'amounts'].var())
print("amounts 的描述:\n",data.loc[:,'amounts'].describe())
# 共8种值 :非空值数目 ,均值,最小,最大,标准差,3个分位数
print("amounts 的极差:\n",data.loc[:,'amounts'].ptp())
print("amounts 的标准差:\n",data.loc[:,'amounts'].std())
print("amounts 的众数:\n",data.loc[:,'amounts'].mode()) # 返回众数的数组
print("amounts 的非空值的数目:\n",data.loc[:,'amounts'].count())
print("amounts 的最大值的位置:\n",data.loc[:,'amounts'].idxmax()) # np.argmax()
print("amounts 的最小值的位置:\n",data.loc[:,'amounts'].idxmin())
# 对于两列的统计结果
print("amounts 的describe:\n",data.loc[:,['counts','amounts']].describe())
pandas的非数值类型统计
# pandas的非数值类型统计
# 转化为object类型或者类别型数据
data.loc[:,'amounts'] = data.loc[:,'amounts'].astype('object')
print(data.dtypes)
print(data.dtypes)
data.loc[:,'amounts'] = data.loc[:,'amounts'].astype('category')
print(data.dtypes)
print("amounts 的描述:\n",data.loc[:,'amounts'].describe())
# 共4种值 :非空值数目 ,去重之后的数据,众数,众数出现的频数

使用groupby方法拆分数据【分组聚合】

groupby方法的参数及其说明——by参数的特别说明

Ø 如果传入的是一个函数则对索引进行计算并分组。

Ø 如果传入的是一个字典或者Series则字典或者Series的值用来做分组依据。

Ø 如果传入一个NumPy数组则数据的元素作为分组依据。

Ø 如果传入的是字符串或者字符串列表则使用这些字符串所代表的字段作为分组依据。groupby方法的参数及其说明——by参数的特别说明

用groupby方法分组后的结果并不能直接查看,而是被存在内存中,输出的是内存地址。实际上分组后的数据对象GroupBy类似Series与DataFrame,是pandas提供的一种对象。GroupBy对象常用的描述性统计方法如下

在这里插入图片描述

agg和aggregate函数参数及其说明

agg,aggregate方法都支持对每个分组应用某函数,包括Python内置函数或自定义函数。同时这两个方法能够也能够直接对DataFrame进行函数应用操作。
Ø 在正常使用过程中,agg函数和aggregate函数对DataFrame对象操作时功能几乎完全相同,因此只需要掌握其中一个函数即可。它们的参数说明如下表
在这里插入图片描述

import pandas
import numpy

# 加载数据
data = pandas.read_excel('data_file/users.xlsx')


# 根据班级分组、统计学员的班级的平均年龄
# groupby  分组
#  by  ---指定分组的列,可以是单列 也可以是多列
res = data.groupby(by='ORGANIZE_NAME')['age'].mean()
print(res)
# 按照单列分组,获取多列的
res = data.groupby(by='ORGANIZE_NAME')[['age','USER_ID']].mean()
# 按照多列分组,获取单列
res1 = data.groupby(by=['ORGANIZE_NAME','poo','sex'])['age'].mean()
print(res,'\n',res1)

print('-*'*50)
# 利用agg同时对age 求平均值、对userid 求最大值
res1 = data.agg({'age':numpy.mean,'USER_ID':numpy.max})
print(res1)

#  对age 和 USER_ID 同时分别求 和 和均值
res = data[['age','USER_ID']].agg([numpy.sum,numpy.mean])
print(res)

# 对age  USER_ID 求取不同个数的统计指标
res = data.agg({'age':numpy.min,'USER_ID':[numpy.mean,numpy.sum]})
print(res)



# 自定义函数进行计算
def hh(x):
    return  x+1

res = data['age'].apply(hh)
print(res)

res = data[['age','USER_ID']].apply(lambda x:x+1)
print(res)

res = data['age'].transform(lambda x:x+1)
print(res)
agg方法与自定义的函数

Ø 在agg方法可传入读者自定义的函数。

Ø 使用自定义函数需要注意的是NumPy库中的函数np.mean,np.median,np.prod,np.sum,np.std,np.var能够在agg中直接使用,但是在自定义函数中使用NumPy库中的这些函数,如果计算的时候是单个序列则会无法得出想要的结果,如果是多列数据同时计算则不会出现这种问题。

Ø 使用agg方法能够实现对每一个字段每一组使用相同的函数。

Ø 如果需要对不同的字段应用不同的函数,则可以和Dataframe中使用agg方法相同。

透视表与交叉表

透视表 是一种plus[加强]版的分组聚合,交叉表是 mini版的透视表。

利用pivot_table函数可以实现透视表,pivot_table()函数的常用参数及其使用格式如下。

在这里插入图片描述

交叉表是一种特殊的透视表,主要用于计算分组频率。利用pandas提供的crosstab函数可以制作交叉表,crosstab函数的常用参数和使用格式如下。

在这里插入图片描述

import pandas

# 加载数据
data = pandas.read_excel('data_file/meal_order_detail.xlsx')


# 获取时间点的属性
data.loc[:,'place_order_time'] = pandas.to_datetime(data.loc[:,'place_order_time'])

# 以列表推导式来获取日属性

data.loc[:,'day'] = [i.day for i in data.loc[:,'place_order_time']]



#  透视表 是一种plus[加强]版的分组聚合
# 创建一个透视表
# data-- 想要的dataframe数据
# values -- 最终统计指标所针对的对象,要关心的数据主体【要进行处理数据的列】
# index  --按照index 进行 行分组
# columns ---按照columns进行列分组
# aggfunc ---对主体 进行什么指标的统计
# margins ---开关【文件中多一个all列】
res = pandas.pivot_table(data=data[['amounts','order_id','counts','detail_id','dishes_name','day']]
                         ,values='amounts',columns=['day','counts'],index=['order_id','dishes_name']
                         ,aggfunc='mean',margins=True)

print(res)
print('_*'*40)
# 交叉表  mini版的透视表
# 如果只传index 与columns 统计这两列的相对个数
res = pandas.crosstab(index=data['counts'],columns=data['amounts'])
print(res)
print('_*'*40)

# values 必须和aggfunc同时存在
res = pandas.crosstab(index=data['order_id'],columns=data['counts'],values=data['amounts'],aggfunc='mean')
print(res)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值