文科生自學Python-對比學習pivot_table和groupby透視功能

--人生不是賽場,夢想不容退場,學習程式設計成就更好的自己--

Python語言簡潔生動,特別適合文科生學習入門IT世界,用幾十行程式碼就能夠做一個完整的爬蟲指令碼,開發效率槓槓的!短時間內即可解決工作和學習中碰到的各種棘手問題。

(本人外語專業畢業,機緣巧合愛上程式設計,自學道路曲曲折折,痛並快樂!)

這裡總結一下自學Python遇到的難點和重點,分享碼過的程式碼和要點總結,希望能夠給初學者一點啟示和鼓勵,同時願意結交更多大神交流有助提升自己的水平。

大家平時在使用Python處理資料時基本上首選

pandas

庫,在使用pandas清洗完資料後往往需要透過透視功能得到最終資料結果集方便生成表格和視覺化影象報告,實現透視功能主要有

pivot_table

groupby

兩種方法,今天就給大家舉例來對比一下,讓小夥伴們有一個基本的認識和了解,下面使用

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 packagesimport pandas as pdimport numpy as npimport datetimeimport osimport redef 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 infodata = pd。read_excel(“marketing_campaign。xlsx”,sheet_name=“marketing_campaign”,header=0,index_col=None)display(data。dtypes)#Check the general condition of the datadisplay(data。head())#Add more useful fields for further analysis#Define a function to sort people with agedef 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 groupsdata[“年齡層”] = data[“Year_Birth”]。apply(Get_Rating_Age)#Get the total figure of the children in familydata[“孩子數”] = data[“Kidhome”] + data[“Teenhome”]data[“註冊日期”]= pd。to_datetime(data[“Dt_Customer”])data[“註冊年份”]= data[“註冊日期”]。dt。year。astype(str)data[“註冊人數”] = 1display(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 intpivot_age[“MntMeatProducts”]= pivot_age[“MntMeatProducts”]。astype(int) #Change float into intpivot_age[“MntWines”]= pivot_age[“MntWines”]。astype(int) #Change float into intpivot_age[“孩子數”]= pivot_age[“孩子數”]。round(1) #Change float with 0。1 as unitdisplay(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 intdisplay(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 intpivot_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

我為人人,人人為我!!歡迎大家關注,點贊和轉發!!!

~~人生不是賽場,夢想不容退場~~不斷努力學習蛻變出一個更好的自己,不斷分享學習路上的收穫和感悟幫助他人成就自己!!!