文科生自学Python-初识pandas的Transform和Map方法

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

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

上次介绍了pandas中重要的透视方法Pivot_tableGroupby,今天带大家通过上次的kaggle数据集案例介绍两个非常实用的数据处理方法分别是TransformMap,前者可以得到分组聚合项(例如,每个年龄层各自对应的收入总和),后者可以通过字典的方式来替换某个字段的所有字符(例如,可以把某字段英文分类名词替换为中文方便中文读者阅读),接下来看看具体操作吧:

切换路径读取数据并做好预处理:

清洗好数据其实就完成了一大半的数据工作,大家一定要重视前期工作:

文科生自学Python-初识pandas的Transform和Map方法

结果如下:

文科生自学Python-初识pandas的Transform和Map方法

通过年龄层维度分组来做几个字段透视如下:

通过Groupby方法透视得到不同年龄层人群对应的孩子总数,收入总数,酒类支出平均值和肉类支出最大值:

文科生自学Python-初识pandas的Transform和Map方法

如果想把上面按年龄分组得到的聚合数值匹配给数据源,如何实现呢?有请Transform出场吧:

通过Transform方法把分组聚合数值匹配给数据源:

操作结果显示:不同年龄层对应的收入总和匹配给每行数据,这样就能够得到对应的占比数据了,是不是非常方便呢!!

文科生自学Python-初识pandas的Transform和Map方法

刚刚的方法只是划分了一个维度-年龄层,如果再多一点维度呢?

通过年龄层和注册年份两个维度分组来做几个字段透视如下:

分级更复杂一些,也同样可以用Transform来解决。

文科生自学Python-初识pandas的Transform和Map方法

通过Transform方法把分组聚合数值匹配给数据源:

通过“收入汇总-年龄层-注册年份-占比”来展示,一样得到了分组聚合结果和对应的占比!!!

文科生自学Python-初识pandas的Transform和Map方法

通过教育程度维度分组来做几个字段透视如下:

显示有几处还是英语单词,如何替换成对应中文呢?

文科生自学Python-初识pandas的Transform和Map方法

首先通过rename方法重命名字段名如下:

文科生自学Python-初识pandas的Transform和Map方法

通过map方法替换“教育程度”字段内所有英文名,再透视如下:

经过map方法操作后学历背景分类都是中文了(学历背景翻译如有不妥的地方还请谅解),针对数量限定的标签分类替换均可轻松解决!

文科生自学Python-初识pandas的Transform和Map方法

代码汇总如下:

import pandas as pd
import numpy as np
import datetime
import os
def Set_Work_Path(x):
    try:
        os.chdir(x)
        route = os.getcwd()
        return route
    except Exception:
        print("No Result")
work_path = r"F:DATA"
Set_Work_Path(work_path)
#Load and Check data
data = pd.read_excel("marketing_campaign.xlsx",sheet_name="marketing_campaign",header=0,index_col=None)
#Define a function to sort people with age
def Get_Rating_Age(x):
    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 current year with datetime 
data["年龄层"] = data["Year_Birth"].apply(Get_Rating_Age)
data["孩子数"] = data["Kidhome"] + data["Teenhome"]
data["注册日期"]= pd.to_datetime(data["Dt_Customer"])
data["注册年份"]= data["注册日期"].dt.year.astype(str)
data["注册人数"] = 1
display(data.head())

#get pivot with groupby
data_groupby = data.groupby(["年龄层"]).agg({"孩子数":np.sum,"Income":np.sum,"MntWines":np.mean,"MntMeatProducts":np.max})
data_groupby["MntMeatProducts"] = data_groupby["MntMeatProducts"].astype(int)
data_groupby["MntWines"] = data_groupby["MntWines"].astype(int)
data_groupby["Income"] = data_groupby["Income"].astype(int)
data_groupby["孩子数"] = data_groupby["孩子数"].round(1)
data_groupby.reset_index(inplace=True)
display(data_groupby)

#Get the new fields with transform
data["孩子总数-年龄层"] = data.groupby("年龄层")["孩子数"].transform("sum")
data["收入汇总-年龄层"] = data.groupby("年龄层")["Income"].transform("sum").astype(int)
data["酒类平均水平-年龄层"] = data.groupby("年龄层")["MntWines"].transform("mean").astype(int)
data["肉类最高水平-年龄层"] = data.groupby("年龄层")["MntMeatProducts"].transform("max").astype(int)
data["收入汇总-年龄层-占比"]=(data["Income"]/data["收入汇总-年龄层"]).apply(lambda x:format(x,"0.3%")) #change the format
display(data.head())

#get pivot with groupby for show transform
data_groupby = data.groupby(["年龄层","注册年份"]).agg({"孩子数":np.sum,"Income":np.sum,"MntWines":np.mean,"MntMeatProducts":np.max})
data_groupby["MntMeatProducts"] = data_groupby["MntMeatProducts"].astype(int)
data_groupby["MntWines"] = data_groupby["MntWines"].astype(int)
data_groupby["Income"] = data_groupby["Income"].astype(int)
data_groupby["孩子数"] = data_groupby["孩子数"].round(1)
data_groupby.reset_index(inplace=True)
display(data_groupby)

data["收入汇总-年龄层-注册年份"] = data.groupby(["年龄层","注册年份"])["Income"].transform("sum").astype(int)
data["收入汇总-年龄层-注册年份-占比"]=(data["Income"]/data["收入汇总-年龄层-注册年份"]).apply(lambda x:format(x,"0.3%")) #change the format
display(data.head())

#Get new field with transform
data_groupby = data.groupby(["Education"]).agg({"孩子数":np.sum,"Income":np.sum,"MntWines":np.mean,"MntMeatProducts":np.max})
data_groupby["MntMeatProducts"] = data_groupby["MntMeatProducts"].astype(int)
data_groupby["MntWines"] = data_groupby["MntWines"].astype(int)
data_groupby["Income"] = data_groupby["Income"].astype(int)
data_groupby["孩子数"] = data_groupby["孩子数"].round(1)
data_groupby.reset_index(inplace=True)
display(data_groupby)

#Change Columns Names
data.rename(columns={"Income":"收入","MntWines":"酒类支出","MntMeatProducts":"肉类支出"},inplace=True)
display(data.head())

#Use Map to replace the words in one field
data["学历背景"] = data["Education"].map({"PhD":"博士", "Basic":"专科","Graduation":"本科","2n Cycle":"双学位","Master":"硕士"})
data_groupby = data.groupby(["学历背景"]).agg({"孩子数":np.sum,"收入":np.sum,"酒类支出":np.mean,"肉类支出":np.max})
data_groupby["肉类支出"] = data_groupby["肉类支出"].astype(int)
data_groupby["酒类支出"] = data_groupby["酒类支出"].astype(int)
data_groupby["收入"] = data_groupby["收入"].astype(int)
data_groupby["孩子数"] = data_groupby["孩子数"].round(1)
data_groupby.reset_index(inplace=True)
display(data_groupby)

看到这里大家是不是已经明白了Transform和Map的具体操作方法了吧,赶紧动手测试一下!!!

END

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

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

展开阅读全文

页面更新:2024-03-18

标签:方法   维度   数据源   字段   酒类   肉类   中文   年份   支出   透视   学历   年龄   收入   孩子   数据   科技

1 2 3 4 5

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

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

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

Top