练习

import pandas as pddetail = pd.read_excel('detail.xlsx')print(detail.loc[:,['counts','amounts']].describe())# 按照菜品名分类
detail['dishes_name'] = detail['dishes_name'].astype('category')
print(detail['dishes_name'].describe())
# count     10037    --10037条数据
# unique      157    --157个菜品
# top       白饭/大碗    --最多的
# freq        323    --top数
# Name: dishes_name, dtype: object
print(detail['dishes_name'].describe().top)    # 白饭/大碗# 按照订单号分类
detail['order_id'] = detail['order_id'].astype('category')
# print(detail['order_id'])
print(detail[['order_id','dishes_name']].describe())
#         order_id dishes_name
# count      10037       10037
# unique       942         157
# top          398       白饭/大碗
# freq          36         323

一、时间数据操作的补充

import pandas as pddetail = pd.read_excel('detail.xlsx')
detail['place_order_time'] = pd.to_datetime(detail['place_order_time'])years = [i.year for i in detail['place_order_time']]
print(years)    # 列表print(detail['place_order_time'].dt.year)    # 序列

二、分组聚合

import pandas as pd
import numpy as npdetail = pd.read_excel('data/meal_order_detail.xlsx')

(一)分组

groupby()

result = detail[['order_id','counts','amounts']].groupby(by='order_id')
# print(result)    # <pandas.core.groupby.DataFrameGroupBy object at 0x0000000006243978>
# print(result['counts'])    # <pandas.core.groupby.SeriesGroupBy object at 0x0000000006184E48>

可进行分组,但分组后的所有列,只能使用相同的聚合函数操作。

如果想让不同列进行不同的聚合操作,就只能编写多次,分别操作。

# 分组后,每个订单平均点了多少份菜和菜的均价
print(result.mean())
print(result[['counts','amounts']].mean())# 分组后,每个订单点菜数和销售总额
print(result.sum())# 分组后,每组中的数据条数
print(result.size())

(二)聚合

1.agg()/aggregate()

**def aggregate(self, func, axis=0, *args, ****kwargs):

不同列可进行不同的聚合操作。

(1)用法1

对counts和amounts进行求和操作

print(detail[['counts','amounts']].agg(np.sum))

对counts进行求和操作,对amounts进行均值操作

func接收多个函数名,使用列表将多个函数名封装起来。

print(detail[['counts','amounts']].agg([np.sum,np.mean]))
#             counts        amounts
# sum   11126.000000  449872.000000
# mean      1.108499      44.821361

(2)用法2

print(detail.agg({'counts':np.sum,'amounts':np.mean}))
# counts     11126.000000
# amounts       44.821361
# dtype: float64
print(detail.agg({'counts':np.sum,'amounts':[np.sum,np.mean]}))
#        counts        amounts
# mean      NaN      44.821361
# sum   11126.0  449872.000000

(3)自定义统计函数

销量*2

def double_sum(data):return np.sum(data)*2
print(detail.agg({'counts':double_sum}))

(4)在分组的基础上进行聚合函数

格式:DataFrameGroupBy.聚合函数

result = detail[['order_id','counts','amounts']].groupby(by='order_id')
print(result.agg({'counts':np.sum,'amounts':[np.sum,np.mean]}))

2.apply()

**def apply(self, func, axis=0, broadcast=False, raw=False, reduce=None,args=(), ****kwds):

detail[[‘counts’,‘amounts’]]–DataFrame
detail[‘counts’]–Series

可以对DataFrame操作,也可以对Series进行操作。

print(detail[['counts','amounts']].apply(np.mean))
print(result.apply(np.mean))

apply和agg的区别

apply是对整个表格中的数据进行整合;agg可以让不同的字段执行不同的聚合函数。

(三)解决离差标准化问题

1.离差标准化

本质:就是对原始数据进行线性变换。

特点:通过离差标准化的计算后,计算的值将落在[0,1]区间内。

解决离差标准化的好处

  1. 很方便做十分制和百分制的换算
  2. 消除大单位和小单位的影响,消除量纲(量纲:变异大小的差异影响)

薪资数据:5000,6000,8000,10000,15000

第一组(以元为单位):

5000,6000,8000,10000,15000

第二组(以k为单位):

5,6,8,10,15

对这两组数据计算方差/标准差,以表示数据的离散程度。

显然第一组数据要比第二组数据的标准差大得多,也就是更加离散。

2.计算

公式:new_X = (X-min)/(max-min)

值域:[0,1]

3.使用transform(),解决利差标准化

counts_min = detail['counts'].min()
counts_max = detail['counts'].max()
print(detail['counts'].transform(lambda x:(x-counts_min)/(counts_max-counts_min)))amounts_min = detail['amounts'].min()
amounts_max = detail['amounts'].max()
print(detail['amounts'].transform(lambda x:(x-amounts_min)/(amounts_max-amounts_min)))

解决前后的标准差对比

print(detail['amounts'].std())    # 36.80855003545274
amounts_min = detail['amounts'].min()
amounts_max = detail['amounts'].max()
detail['amounts_std'] = (detail['amounts']-amounts_min)/(amounts_max-amounts_min)
print(detail['amounts_std'].std())    # 0.2079579098048175

三、透视表/交叉表

(一)透视表

pivot_table()

def pivot_table(data, values=None, index=None, columns=None, aggfunc=‘mean’,fill_value=None, margins=False, dropna=True,margins_name=‘All’):

aggfunc–聚合函数名,不指定时,默认使用mean求平均

detail_pivot1 = pd.pivot_table(detail[['order_id','counts','amounts']],index='order_id')
print(detail_pivot1)detail_pivot2 = pd.pivot_table(detail[['order_id','counts','amounts']],index='order_id',aggfunc=np.sum)
detail_pivot2 = pd.pivot_table(detail[['order_id','counts','amounts']],index='order_id',aggfunc='sum')
print(detail_pivot2)

(二)交叉表

crosstab()

index参数不能跟字段名,要跟字段值。

result = pd.crosstab(index=detail['order_id'],columns=detail['dishes_name'],values=detail['counts'],aggfunc=np.sum)
print(result)

四、项目–员工信息分析

import pandas as pd
import numpy as npdata = pd.read_excel('英雄联盟员工信息表.xlsx')

1.表中有些员工数据是重复的,通过选取合适的字段对整个表进行去重

当工号与名字一样时认为该数据为重复

print('原始:\n',data.shape)# inplace=True--无返回值
# inplace=False--有返回值
data.drop_duplicates(subset=['姓名','工号'],inplace=True)
print('去重后:\n',data.shape)

2.员工平均工作年限是多少?

print(data['工龄'].mean())

3.公司任职最久的三名员工分别是谁?

对一个序列进行排序

sort_values()

def sort_values(self, by, axis=0, ascending=True, inplace=False,kind=‘quicksort’, na_position=‘last’):

ascending–默认True,升序;False为降序

# results = data['工龄'].sort_values(by='工龄')    # 会报错
result = data[['姓名','工龄']].sort_values(by='工龄',ascending=False,inplace=False)
print(result.head(3))

4.员工总体流失率是多少?

values

序列–>数组

print(data['姓名'])# print(data['姓名'].values)

data[‘状态’] == ‘离职’ – 广播

mask = data['状态']=='离职'
print(data.iloc[mask,:])
num = data.iloc[mask.values,:].shape[0]
print('离职率:',num/data.shape[0])

还可简化为

num = mask.values.sum()
print('离职率:',num/data.shape[0])

5.各部门有多少名员工?

result = data[['部门','姓名']].groupby(by='部门').count()
print(result)

问题

有时inplace=True,会报警告。

比如:

data[['姓名','工龄']].sort_values(by='工龄',ascending=False,inplace=True)

原因

原始数据有八列,这里将’姓名’、'工龄’两列排序。

如果使用inplace=True修改原始数据,就相当于剩下的六列没变化,将排序后的两列放入,会造成数据混乱。

数据分析(六)--聚合分组,交叉表,透视表,练习相关推荐

  1. 【Pandas分组聚合】进阶:透视表、交叉表(pivot_table() 、crosstab())

    Pandas透视表.交叉表 创建DataFrame结构 透视表 pivot_table() 单列聚合 多列聚合 交叉表 crosstab() 计算分组频率 两列分组后求第三列的统计指标 创建DataF ...

  2. MySQL之数据分组与数据透视表

    目录 (1)对分组后的数据进行聚合运算 (2)对聚合后的数据进行条件筛选 (3)group_concat()函数 (4)rollup (5)数据透视表 开发工具: mysql-8.0 DataGrip ...

  3. 数据分析Excel必备技能:数据透视表使用教程

    点击上方蓝色字关注~ 来源:掘金 处理数量较大的数据时,一般分为数据获取.数据筛选,以及结果展示几个步骤.在 Excel 中,我们可以利用数据透视表(Pivot Table)方便快捷的实现这些工作. ...

  4. excel使用教程_数据分析Excel必备技能:数据透视表使用教程

    江米小枣tonylua | 作者 掘金 | 来源 处理数量较大的数据时,一般分为数据获取.数据筛选,以及结果展示几个步骤.在 Excel 中,我们可以利用数据透视表(Pivot Table)方便快捷的 ...

  5. Pandas-高级处理(七):透视表(pivot_table)【以指定列作为行索引对另一指定列的值进行分组聚合操作】、交叉表(crosstab)【统计频率】

    交叉表与透视表的作用 交叉表:计算一列数据对于另外一列数据的分组个数 透视表:指定某一列对另一列的关系 一.透视表 透视表是一种可以对数据动态排布并且分类汇总的表格格式. 透视表:透视表是将原有的Da ...

  6. 【Python】数据分析.pandas.透视表与交叉表

    文章目录 数据分析-pandas.透视表与交叉表 一.透视表 二.交叉表 三.任务实现 数据分析-pandas.透视表与交叉表 一.透视表 数据透视表是数据分析中常见的工具之一,根据一个或多个键值对数 ...

  7. Python数据分析 | (31) 透视表和交叉表

    目录 1. 透视表 2. 交叉表:crosstab 3. 总结 1. 透视表 透视表(pivot table)是各种电子表格程序和其他数据分析软件中一种常见的 数据汇总工具.它根据一个或多个键对数据进 ...

  8. 【DS with Python】DataFrame的合并、分组聚合与数据透视表

    文章目录 前言 一.DataFrame的合并 1.1 按列名合并 (pd.merge()) 1.2 相同列添加行数 (pd.concat()功能) 二.应用 (.apply()功能) 三.分组 (.g ...

  9. 4.5 创建透视表与交叉表

    4.5 创建透视表与交叉表 4.5.1利用pivot_table函数可以实现透视表 pivot_table函数的常用参数及其说明 4.5.2 使用crosstab函数创建交叉表 crosstab函数的 ...

  10. 【Python】开启Pandas进阶:图解Pandas透视表、交叉表

    一.图解Pandas透视表.交叉表 终于开始Pandas进阶内容的写作了.相信很多人都应该知道透视表,在Excel会经常去制作它,来实现数据的分组汇总统计.在Pandas中,我们把它称之为pivot_ ...

最新文章

  1. 【网络基础】02、IP地址
  2. 全球首款AI的操作系统来了!100%国产,像用Windows一样简单
  3. 点击图片传值到text 尚未解决
  4. 3.1 关于半鞅的随机积分(Ren)
  5. ICCV 2019 | SPM:单阶段人体姿态估计解决方案
  6. JVM插桩之三:javaagent介绍及javassist介绍
  7. 在 Azure App Service 上运行 .NET 6 预览版
  8. 【机器学习】Softmax和Sigmoid
  9. Python+常用模块(2).md
  10. durpal是否支持php7,drupal7 的安装方法
  11. CheckStyle检查规则模板说明
  12. C++ 随机数函数rand()与srand()的思考
  13. DNS在什么情况下才能动态更新|活动目录集成的dns区域
  14. 模拟电路电源芯片PROTUES
  15. 洛达检测软件AB1562UT_1.4.4新版本下载,适用洛达全系列
  16. sketchbook使用数位板,笔的鼠标右键无效
  17. 利用github和hexo一步步生成个人博客(2)---基本配置和发表文章
  18. 【openGL】安装篇(上):Windows
  19. 新星计划·能够 120% 提升博文美感的表情包,你们确定不心动吗?
  20. android 环信客服修改自己的头像

热门文章

  1. 微商软文发布方法有哪些?文案怎么编辑?
  2. 微商深度揭秘——减肥产品、推广方法
  3. 2021年,小傅哥の年终总结
  4. 转:W10数字许可激活C#版v3.6 win10永久激活工具
  5. 英特尔傲腾持久内存 Optane DC Persistent Memory Module
  6. Qt创建Qt Designer自定义控件及使用
  7. OpenCV静态编译配置基于小熊猫C++
  8. 什么是BS,BS和CS的区别有哪些:
  9. 电机控制方法以及区别
  10. 如何设谷歌浏览器黑色浏览背景