文科生自学Python-对比学习pivot_table和groupby透视功能
liuian 2025-01-13 15:31 14 浏览
--人生不是赛场,梦想不容退场,学习编程成就更好的自己--
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
我为人人,人人为我!!欢迎大家关注,点赞和转发!!!
~~人生不是赛场,梦想不容退场~~不断努力学习蜕变出一个更好的自己,不断分享学习路上的收获和感悟帮助他人成就自己!!!
相关推荐
- vue怎么和后端php配合
-
Vue和后端PHP可以通过HTTP请求进行配合。首先,前端Vue可以使用axios库或者Vue自带的$http对象来发送HTTP请求到后端PHP接口。通过axios库发送POST、GET、PUT等请求...
- Ansible最佳实践之 AWX 使用 Ansible 与 API 通信
-
#头条创作挑战赛#API简单介绍红帽AWX提供了一个类似Swagger的RESTful风格的Web服务框架,可以和awx直接交互。使管理员和开发人员能够在webUI之外控制其...
- PHP8.3 错误处理革命:Exception 与 Error 全面升级
-
亲爱的小伙伴,好久没有发布信息了,最近学习了一下PHP8.3的升级,都有哪些优化和提升,把学到的分享出来给需要的小伙伴充下电。技术段位:高可用性必修目标收益:精准错误定位+异常链路追踪适配场景...
- 使用 mix/vega + mix/db 进行现代化的原生 PHP 开发
-
最近几年在javascript、golang生态中游走,发现很多npm、gomod的优点。最近回过头开发MixPHPV3,发现composer其实一直都是一个非常优秀的工具,但是...
- 15 个非常好用的 JSON 工具
-
JSON(JavaScriptObjectNotation)是一种流行的数据交换格式,已经成为许多应用程序中常用的标准。无论您是开发Web应用程序,构建API,还是处理数据,使用JSON工具可以大...
- php8环境原生实现rpc
-
大数据分布式架构盛行时代的程序员面试,常常遇到分布式架构,RPC,本文的主角是RPC,英文名为RemoteProcedureCall,翻译过来为“远程过程调用”。主流的平台中都支持各种远程调用技术...
- 「PHP编程」如何搭建私有Composer包仓库?
-
在前一篇文章「PHP编程」如何制作自己的Composer包?中,我们已经介绍了如何制作自己的composer包,以及如何使用composer安装自己制作的composer包。不过,这其中有...
- WAF-Bypass之SQL注入绕过思路总结
-
过WAF(针对云WAF)寻找真实IP(源站)绕过如果流量都没有经过WAF,WAF当然无法拦截攻击请求。当前多数云WAF架构,例如百度云加速、阿里云盾等,通过更改DNS解析,把流量引入WAF集群,流量经...
- 【推荐】一款 IDEA 必备的 JSON 处理工具插件 — Json Assistant
-
JsonAssistant是基于IntelliJIDEs的JSON工具插件,让JSON处理变得更轻松!主要功能完全支持JSON5JSON窗口(多选项卡)选项卡更名移动至主编辑器用...
- 技术分享 | 利用PHAR协议进行PHP反序列化攻击
-
PHAR(“PhpARchive”)是PHP中的打包文件,相当于Java中的JAR文件,在php5.3或者更高的版本中默认开启。PHAR文件缺省状态是只读的,当我们要创建一个Phar文件需要修改...
- php进阶到架构之swoole系列教程(一)windows安装swoole
-
目录概述安装Cygwin安装swoolephp7进阶到架构师相关阅读概述这是关于php进阶到架构之swoole系列学习课程:第一节:windows安装swoole学习目标:在Windows环境将搭建s...
- go 和 php 性能如何进行对比?
-
PHP性能很差吗?每次讲到PHP和其他语言间的性能对比,似乎都会发现这样一个声音:单纯的性能对比没有意义,主要瓶颈首先是数据库,其次是业务代码等等。好像PHP的性能真的不能单独拿出来讨论似的。但其实一...
- Linux(CentOS )手动搭建LNMP(Linux+Nginx+Mysql+PHP)坏境
-
CentOS搭建LNMP(Linux+Nginx+Mysql+PHP)坏境由于网上各种版本新旧不一,而且Linux版本也不尽相同,所以自己写一遍根据官网的提示自己手动搭建过程。看官方文档很重要,永远...
- json和jsonp区别
-
JSON和JSONP虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种非官方跨域数据交互协议。一个是描述信息的格式,一个是信息传递的约定方法。一、...
- web后端正确的返回JSON
-
在web开发中,前端和后端发生数据交换传输现在最常见的形式就是异步ajax交互,一般返回给js都是json,如何才是正确的返回呢?前端代码想要获取JSON数据代码如下:$.get('/user-inf...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
python使用fitz模块提取pdf中的图片
-
《人人译客》如何规划你的移动电商网站(2)
-
Jupyterhub安装教程 jupyter怎么安装包
-
- 最近发表
- 标签列表
-
- 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)
- uniapp textarea (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- react-admin (33)
- vscode切换git分支 (35)
- vscode美化代码 (33)
- python bytes转16进制 (35)