文科生自学Python-对比学习pivot_table和groupby透视功能
liuian 2025-01-13 15:31 17 浏览
--人生不是赛场,梦想不容退场,学习编程成就更好的自己--
Python语言简洁生动,特别适合文科生学习入门IT世界,用几十行代码就能够做一个完整的爬虫脚本,开发效率杠杠的!短时间内即可解决工作和学习中碰到的各种棘手问题。(本人外语专业毕业,机缘巧合爱上编程,自学道路曲曲折折,痛并快乐!)这里总结一下自学Python遇到的难点和重点,分享码过的代码和要点总结,希望能够给初学者一点启示和鼓励,同时愿意结交更多大神交流有助提升自己的水平。
大家平时在使用Python处理数据时基本上首选pandas库,在使用pandas清洗完数据后往往需要通过透视功能得到最终数据结果集方便生成表格和可视化图像报告,实现透视功能主要有pivot_table和groupby两种方法,今天就给大家举例来对比一下,让小伙伴们有一个基本的认识和了解,下面使用kaggle网站上公布的一个消费数据集合作为案例来展示:
切换路径读取数据并查看整体字段信息:
切换路径:
读取数据整体字段信息:
文本字段主要包括:教育程度,婚姻状况,注册时间;数值字段主要包括:家庭年收入,家中孩童数量,两年内购买红酒支出和两年内购买肉类支出等。
查看数据前5行为后续处理和分析做好准备:
考虑添加一些新字段,比如通过出生年份得到年龄分层,还可添加注册人数字段,在家孩童需要把小朋友和少年字段求和等:
添加新的字段并查看结果:
从结果来看成功添加了年龄分层字段,注册年份和注册人数等,方便后续展开分析:
使用pivot_table做透视提取数据结果-一维查询:
根据年龄层和教育程度进行分类,查看了年收入平均水平,购买肉和酒的平均支出,家庭孩子平均数和注册人数总和,注意:生成的透视结果列字段顺序基本上以首字母为准:
使用groupby做透视提取数据结果-一维查询:
可以看到使用groubpy也得到了相同的结果,小伙伴们可根据自己的喜好和习惯进行选择,这里对比看出groupby方法代码量更简洁一些,同时还可根据需求来调整字段顺序,如下面所示:
调整字段顺序如下:
使用pivot_table做透视提取数据结果-二维交叉查询:
这里引入了columns参数后就得到了二维交叉查询,玩转excel透视表的小伙伴们一定很熟悉吧:
使用groupby做透视提取数据结果-二维交叉查询:
这里需要两步走,第一步生成一维查询表:
第二步通过unstack()方法变成二维交叉查询表:
使用pivot_table做较复杂透视查询:
这里用pivot_table来透视一下,加一点难度和复杂度:
代码汇总如下:
#Import necessary packages
import pandas as pd
import numpy as np
import datetime
import os
import re
def Set_Work_Path(x):
try:
os.chdir(x)
route = os.getcwd()
return route
except Exception:
print("No Result")
work_path = r"E:\DATA\03SEP21-Pandas"
Set_Work_Path(work_path)
#Load and Check data info
data = pd.read_excel("marketing_campaign.xlsx",sheet_name="marketing_campaign",header=0,index_col=None)
display(data.dtypes)
#Check the general condition of the data
display(data.head())
#Add more useful fields for further analysis
#Define a function to sort people with age
def Get_Rating_Age(x):
#Get the current year with datetime
current_year = datetime.datetime.today().year
if (current_year - x) >= 60:
return "老年组"
elif(current_year - x)>= 40:
return "中年组"
elif(current_year - x)>= 18:
return "青年组"
else:
return "少年组"
#Get the new field to sort our people with age groups
data["年龄层"] = data["Year_Birth"].apply(Get_Rating_Age)
#Get the total figure of the children in family
data["孩子数"] = data["Kidhome"] + data["Teenhome"]
data["注册日期"]= pd.to_datetime(data["Dt_Customer"])
data["注册年份"]= data["注册日期"].dt.year.astype(str)
data["注册人数"] = 1
display(data.head())
#display(data.dtypes)
#get pivot with pivot_table 通过pivot_table来生成透视表
pivot_age = pd.pivot_table(data,index=["年龄层","Education"],values=["孩子数","Income","MntWines","MntMeatProducts","注册人数"],\
aggfunc={"孩子数":np.mean,"Income":np.mean,"MntWines":np.mean,"注册人数":np.sum,"MntMeatProducts":np.mean},\
fill_value=0)
pivot_age["Income"]= pivot_age["Income"].astype(int) #Change float into int
pivot_age["MntMeatProducts"]= pivot_age["MntMeatProducts"].astype(int) #Change float into int
pivot_age["MntWines"]= pivot_age["MntWines"].astype(int) #Change float into int
pivot_age["孩子数"]= pivot_age["孩子数"].round(1) #Change float with 0.1 as unit
display(pivot_age)
#get pivot with groupby and the same with above with pivot_table 通过groupby来生成透视表
data_groupby = data.groupby(["年龄层","Education"]).\
agg({"Income":np.mean,"MntMeatProducts":np.mean,"MntWines":np.mean,"孩子数":np.mean,"注册人数":np.sum})
data_groupby["Income"] = data_groupby["Income"].astype(int)
data_groupby["MntMeatProducts"] = data_groupby["MntMeatProducts"].astype(int)
data_groupby["MntWines"] = data_groupby["MntWines"].astype(int)
data_groupby["孩子数"] = data_groupby["孩子数"].round(1)
display(data_groupby)
#get pivot with groupby and adjust the columns 通过groupby可以调整透视表的列顺序
data_groupby = data.groupby(["年龄层","Education"]).\
agg({"注册人数":np.sum,"孩子数":np.mean,"Income":np.mean,"MntMeatProducts":np.mean,"MntWines":np.mean})
data_groupby["Income"] = data_groupby["Income"].astype(int)
data_groupby["MntMeatProducts"] = data_groupby["MntMeatProducts"].astype(int)
data_groupby["MntWines"] = data_groupby["MntWines"].astype(int)
data_groupby["孩子数"] = data_groupby["孩子数"].round(1)
display(data_groupby)
#get pivot with pivot_table 通过pivot_table来生成透视表,并生成交叉查询表
pivot_enrollment_year = pd.pivot_table(data,index=["注册年份"],columns=["Education"],values=["Income","注册人数"],\
aggfunc={"Income":np.mean,"注册人数":np.sum},\
fill_value=0,margins=False)
pivot_enrollment_year["Income"]= pivot_enrollment_year["Income"].astype(int) #Change float into int
display(pivot_enrollment_year)
#get pivot with groupby and adjust the columns 通过groupby可以调整透视表的列顺序
data_groupby_enrollment_year = data.groupby(["注册年份","Education"]).\
agg({"Income":np.mean,"注册人数":np.sum})
data_groupby_enrollment_year["Income"] =data_groupby_enrollment_year["Income"].astype(int)
display(data_groupby_enrollment_year)
data_groupby_target = data_groupby_enrollment_year.unstack()
display(data_groupby_target)
#get pivot with pivot_table 通过pivot_table来生成透视表
pivot_marital_data = pd.pivot_table(data,index=["Marital_Status"],values=["Income","注册人数"],\
aggfunc={"Income":np.sum,"注册人数":np.sum},\
fill_value=0,margins=True)
pivot_marital_data["Income"]= pivot_marital_data["Income"].astype(int) #Change float into int
pivot_marital_data["平均收入"]= (pivot_marital_data["Income"]/pivot_marital_data["注册人数"]).astype(int)
pivot_marital_data.reset_index(inplace=True)
pivot_marital_data.sort_values(by=["Income"],ascending=False,inplace=True)
display(pivot_marital_data)
最后的透视案例生成了分组求和项,同时根据透视表结果做了字段计算,并且根据收入情况进行了排序展示,其实透视功能非常实用和方便,大家只要多写多用就一定会总结出规律和方法,在处理更复杂的需求时就会迎刃而解了!!!!
END
我为人人,人人为我!!欢迎大家关注,点赞和转发!!!
~~人生不是赛场,梦想不容退场~~不断努力学习蜕变出一个更好的自己,不断分享学习路上的收获和感悟帮助他人成就自己!!!
相关推荐
- Optional是个好东西,如果用错了就太可惜了
-
原文出处:https://xie.infoq.cn/article/e3d1f0f4f095397c44812a5be我们都知道,在Java8新增了一个类-Optional,主要是用来解决程...
- IDEA建议:不要在字段上使用@Autowire了!
-
在使用IDEA写Spring相关的项目的时候,在字段上使用@Autowired注解时,总是会有一个波浪线提示:Fieldinjectionisnotrecommended.纳尼?我天天用,咋...
- Spring源码|Spring实例Bean的方法
-
Spring实例Bean的方法,在AbstractAutowireCapableBeanFactory中的protectedBeanWrappercreateBeanInstance(String...
- Spring技巧:深入研究Java 14和SpringBoot
-
在本期文章中,我们将介绍Java14中的新特性及其在构建基于SpringBoot的应用程序中的应用。开始,我们需要使用Java的最新版本,也是最棒的版本,Java14,它现在还没有发布。预计将于2...
- Java开发200+个学习知识路线-史上最全(框架篇)
-
1.Spring框架深入SpringIOC容器:BeanFactory与ApplicationContextBean生命周期:实例化、属性填充、初始化、销毁依赖注入方式:构造器注入、Setter注...
- 年末将至,Java 开发者必须了解的 15 个Java 顶级开源项目
-
专注于Java领域优质技术,欢迎关注作者:SnailClimbStar的数量统计于2019-12-29。1.JavaGuideGuide哥大三开始维护的,目前算是纯Java类型项目中Sta...
- 字节跨平台框架 Lynx 开源:一个 Web 开发者的原生体验
-
最近各大厂都在开源自己的跨平台框架,前脚腾讯刚宣布计划四月开源基于Kotlin的跨平台框架「Kuikly」,后脚字节跳动旧开源了他们的跨平台框架「Lynx」,如果说Kuikly是一个面向...
- 我要狠狠的反驳“公司禁止使用Lombok”的观点
-
经常在其它各个地方在说公司禁止使用Lombok,我一直不明白为什么不让用,今天看到一篇文章列举了一下“缺点”,这里我只想狠狠地反驳,看到列举的理由我竟无言以对。原文如下:下面,结合我自己使用Lomb...
- SpringBoot Lombok使用详解:从入门到精通(注解最全)
-
一、Lombok概述与基础使用1.1Lombok是什么Lombok是一个Java库,它通过注解的方式自动生成Java代码(如getter、setter、toString等),从而减少样板代码的编写,...
- Java 8之后的那些新特性(六):记录类 Record Class
-
Java是一门面向对象的语言,而对于面向对象的语言中,一个众所周知的概念就是,对象是包含属性与行为的。比如HR系统中都会有雇员的概念,那雇员会有姓名,ID身份,性别等,这些我们称之为属性;而雇员同时肯...
- 为什么大厂要求安卓开发者掌握Kotlin和Jetpack?优雅草卓伊凡
-
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡一、Kotlin:Android开发的现代语言选择1.1Kotlin是什么?Kotlin是由...
- Kotlin这5招太绝了!码农秒变优雅艺术家!
-
Kotlin因其简洁性、空安全性和与Java的无缝互操作性而备受喜爱。虽然许多开发者熟悉协程、扩展函数和数据类等特性,但还有一些鲜为人知的特性可以让你的代码从仅仅能用变得真正优雅且异常简洁。让我们来看...
- 自行部署一款免费高颜值的IT资产管理系统-咖啡壶chemex
-
在运维时,ICT资产太多怎么办,还是用excel表格来管理?效率太低,也不好多人使用。在几个IT资产管理系统中选择比较中,最终在Snipe-IT和chemex间选择了chemex咖啡壶。Snip...
- PHP对接百度语音识别技术(php对接百度语音识别技术实验报告)
-
引言在目前的各种应用场景中,语音识别技术已经越来越常用,并且其应用场景正在不断扩大。百度提供的语音识别服务允许用户通过简单的接口调用,将语音内容转换为文本。本文将通过PHP语言集成百度的语音识别服务,...
- 知识付费系统功能全解析(知识付费项目怎么样)
-
开发知识付费系统需包含核心功能模块,确保内容变现、用户体验及运营管理需求。以下是完整功能架构:一、用户端功能注册登录:手机号/邮箱注册,第三方登录(微信、QQ)内容浏览:分类展示课程、文章、音频等付费...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
python使用fitz模块提取pdf中的图片
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- table.render (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)