文科生自學Python-pandas交叉透視表降維變換

--心有猛虎,細嗅薔薇,學習程式設計成就更好的自己--

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

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

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

平時在做資料處理和分析時經常使用

pandas

進行各種透視操作(

pivot_table

),而透視中最常見的是進行兩個維度交叉查詢,此時得到的透視結果集往往是二維錶帶多級標題,如何把二維表變換成為一維表呢?今天就針對這個問題展開展示和講解,接下來看看實際案例吧:

原始資料如下:

文科生自學Python-pandas交叉透視表降維變換

該資料來源主要包括日期,產品名稱和銷售收入,一般透過交叉透視查詢可以得到不同產品在指定日期範圍內的銷售收入情況,但形成的結果往往是多維表並帶多層標題,如何降維成一維表方便滿足其他需求呢(例如生成熱力圖)?

下面來講講如何實現吧:

讀取和檢視資料基本情況:

文科生自學Python-pandas交叉透視表降維變換

新增必要的新欄位方便後續處理:

文科生自學Python-pandas交叉透視表降維變換

透過pivot方法做交叉透視查詢(產品和日期維度交叉)結果如下:

看到該表的產品上方是

日期&星期標題

,而日期&星期具體資料上方則是

收入標題

,如何消除

日期&星期標題

收入標題

呢?這樣得到的就是一維資料表了。

文科生自學Python-pandas交叉透視表降維變換

關鍵步驟1-重置該透視表索引:

可以看到產品來到了資料幀裡面,同時一個新的索引出現了,該索引是關鍵哦!!!!方便後續拼接資料。

文科生自學Python-pandas交叉透視表降維變換

關鍵步驟2-抽取日期對應的資料內容,資料索引還是那個新索引:

注意:這裡得到的還是DataFrame即資料幀,這個部分就是透視表中的核心數值內容,但缺少產品名稱。

文科生自學Python-pandas交叉透視表降維變換

關鍵步驟3-抽取產品名資料,資料索引還是那個共同的新索引:

文科生自學Python-pandas交叉透視表降維變換

關鍵步驟4-透過concat方法橫向拼接兩個資料得到結果:

文科生自學Python-pandas交叉透視表降維變換

最後把產品名稱改為索引列如下:

是不是感覺到索引列十分有用和神奇哇!!

文科生自學Python-pandas交叉透視表降維變換

該一維結果集方便閱讀同時方便其他處理,例如資料視覺化(熱力圖)如下:

文科生自學Python-pandas交叉透視表降維變換

總結處理的全部過程,寫成一個自定義函式來完成這個需求:

文科生自學Python-pandas交叉透視表降維變換

程式碼彙總如下:

#import seaborn to draw heatmapimport plotly。graph_objects as goimport matplotlib。pyplot as pltimport plotly_express as pximport seaborn as snsimport pandas as pdimport numpy as npimport datetimeimport os#Set work pathdef Set_Work_Path(x): try: os。chdir(x) #Set work file path route = os。getcwd() print(route) #print the changed path return route except Exception: print(“No Result”)work_path = r“E:\DATA\20211002”Set_Work_Path(work_path)#讀取和檢查資料data = pd。read_excel(“DATA-Heatmap。xlsx”,header=0,sheet_name=“DATA”,engine=“openpyxl”)display(data。head())display(data。dtypes)#構造新的欄位方便後續分析data[“Weekday”] = data[“Date”]。dt。strftime(“%a”)data[“Date&Weekday”] = data[“Date”]。astype(str) +“-”+ data[“Weekday”]。astype(str)display(data。head())#透過pivot方法獲取透視結果,縱軸顯示產品而橫軸顯示日期和星期pivot = pd。pivot_table(data,index=[“Product”],columns=[“Date&Weekday”],values=[“Revenue”],aggfunc={“Revenue”:np。sum},fill_value=0)display(pivot)#透過重置索引方便後續拼接資料pivot。reset_index(level=0,inplace=True)display(pivot)#獲取日期星期對應的資料和對應索引target_content = pivot[“Revenue”]。astype(int)display(target_content)display(type(target_content))#獲取產品對應的資料和對應索引target_column = pivot[“Product”]display(target_column)display(type(target_column))#把兩個資料透過索引橫向拼接在一起形成一維資料target_data = pd。concat([target_column, target_content],axis=1) #concat two Dataframes with indexdisplay(target_data)#將產品重置為索引列target_data。set_index(“Product”,inplace=True)display(target_data)#https://seaborn。pydata。org/tutorial/color_palettes。html#tools-for-choosing-color-palettesdef Get_Heatmap(X): f, ax = plt。subplots(figsize=(20,5)) fig = sns。heatmap(X,annot=True,fmt=“d”,linewidths=0。5,cmap=“RdBu_r”) #Blues crest nowTime = datetime。datetime。now() Update_Time = nowTime。strftime(‘%Y-%m-%d-%H-%M’) data_out_title = “Product-Revenue-Heatmap-”+Update_Time fig。set_title(label=data_out_title) fig。xaxis。set_ticks_position(“top”) return plt。show()Get_Heatmap(target_data)#定義一個降維函式def Get_Pivot_To_df(X): try: pivot = pd。pivot_table(X,index=[“Product”],columns=[“Date&Weekday”],values=[“Revenue”],aggfunc={“Revenue”:np。sum},fill_value=0) pivot。reset_index(level=0,inplace=True) target_content = pivot[“Revenue”]。astype(int) target_column = pivot[“Product”] target_data = pd。concat([target_column, target_content],axis=1) #concat two Dataframes with index target_data。set_index(“Product”,inplace=True) return target_data except Exception: passtarget = Get_Pivot_To_df(data)display(target)

解決這個問題的關鍵就是重置索引後得到一個共同的新索引,新索引利用concat方法進行橫向拼接,大家是不是也看明白了,如果有興趣那就趕緊動手試一下哇!!!解決這個問題可能還有更簡潔和優雅的辦法,如果其他小夥伴恰好知道和熟悉別的途徑,歡迎與本人分享和討論。

END

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

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