文科生自学Python-对比学习pivot_table和groupby透视功能

--人生不是赛场,梦想不容退场,学习编程成就更好的自己--

Python语言简洁生动,特别适合文科生学习入门IT世界,用几十行代码就能够做一个完整的爬虫脚本,开发效率杠杠的!短时间内即可解决工作和学习中碰到的各种棘手问题。(本人外语专业毕业,机缘巧合爱上编程,自学道路曲曲折折,痛并快乐!)这里总结一下自学Python遇到的难点和重点,分享码过的代码和要点总结,希望能够给初学者一点启示和鼓励,同时愿意结交更多大神交流有助提升自己的水平。

大家平时在使用Python处理数据时基本上首选pandas库,在使用pandas清洗完数据后往往需要通过透视功能得到最终数据结果集方便生成表格和可视化图像报告,实现透视功能主要有pivot_tablegroupby两种方法,今天就给大家举例来对比一下,让小伙伴们有一个基本的认识和了解,下面使用kaggle网站上公布的一个消费数据集合作为案例来展示:

切换路径读取数据并查看整体字段信息:

切换路径:

文科生自学Python-对比学习pivot_table和groupby透视功能

读取数据整体字段信息:

文本字段主要包括:教育程度,婚姻状况,注册时间;数值字段主要包括:家庭年收入,家中孩童数量,两年内购买红酒支出和两年内购买肉类支出等。

文科生自学Python-对比学习pivot_table和groupby透视功能

查看数据前5行为后续处理和分析做好准备:

考虑添加一些新字段,比如通过出生年份得到年龄分层,还可添加注册人数字段,在家孩童需要把小朋友和少年字段求和等:

文科生自学Python-对比学习pivot_table和groupby透视功能

添加新的字段并查看结果:

从结果来看成功添加了年龄分层字段,注册年份和注册人数等,方便后续展开分析:

文科生自学Python-对比学习pivot_table和groupby透视功能

使用pivot_table做透视提取数据结果-一维查询:

根据年龄层和教育程度进行分类,查看了年收入平均水平,购买肉和酒的平均支出,家庭孩子平均数和注册人数总和,注意:生成的透视结果列字段顺序基本上以首字母为准

文科生自学Python-对比学习pivot_table和groupby透视功能

使用groupby做透视提取数据结果-一维查询:

可以看到使用groubpy也得到了相同的结果,小伙伴们可根据自己的喜好和习惯进行选择,这里对比看出groupby方法代码量更简洁一些,同时还可根据需求来调整字段顺序,如下面所示:

文科生自学Python-对比学习pivot_table和groupby透视功能

调整字段顺序如下:

文科生自学Python-对比学习pivot_table和groupby透视功能

使用pivot_table做透视提取数据结果-二维交叉查询:

这里引入了columns参数后就得到了二维交叉查询,玩转excel透视表的小伙伴们一定很熟悉吧:

文科生自学Python-对比学习pivot_table和groupby透视功能

使用groupby做透视提取数据结果-二维交叉查询:

这里需要两步走,第一步生成一维查询表:

文科生自学Python-对比学习pivot_table和groupby透视功能

第二步通过unstack()方法变成二维交叉查询表:

文科生自学Python-对比学习pivot_table和groupby透视功能

使用pivot_table做较复杂透视查询:

这里用pivot_table来透视一下,加一点难度和复杂度:

文科生自学Python-对比学习pivot_table和groupby透视功能

代码汇总如下:

#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:DATA3SEP21-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

我为人人,人人为我!!欢迎大家关注,点赞和转发!!!

~~人生不是赛场,梦想不容退场~~不断努力学习蜕变出一个更好的自己,不断分享学习路上的收获和感悟帮助他人成就自己!!!

展开阅读全文

页面更新:2024-05-11

标签:透视   功能   年收入   字段   孩童   年份   赛场   支出   顺序   人数   年龄   代码   孩子   方法   数据   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top