Pandas_stack和pivot實現資料透視
阿新 • • 發佈:2022-03-08
""" 將列式資料變成二維交叉形式,便於分析,叫做重塑或者透視 1)經過統計得到多維度指標資料 2)使用unstack實現資料二維透視 3)使用pivot簡化透視 4)stack,unstack,pivot的語法 """ import pandas as pd import numpy as np df = pd.read_csv( 'data/ratings.csv', sep=',', engine='python', names='UserID,MovieID,Rating,Timestamp'.split(',') ) df.head() # UserID MovieID Rating Timestamp # 0 1 1 4.0 964982703 # 1 1 3 4.0 964984247 # 2 2 6 4.0 964982224 # 3 2 47 5.0 964983815 # 4 1 50 5.0 964982931 # timestamp為秒 所以unit為s 這一列資料轉換為datetime格式 df['pdate'] = pd.to_datetime(df['Timestamp'], unit='s') df.head() # UserID MovieID Rating Timestamp pdate # 0 1 1 4.0 964982703 2000-07-30 18:45:03 # 1 1 3 4.0 964984247 2000-07-30 19:10:47 # 2 2 6 4.0 964982224 2000-07-30 18:37:04 # 3 2 47 5.0 964983815 2000-07-30 19:03:35 # 4 1 50 5.0 964982931 2000-07-30 18:48:51 df.dtypes # UserID int64 # MovieID int64 # Rating float64 # Timestamp int64 # pdate datetime64[ns] # dtype: object # 1)實現資料統計 dt為時間型別 df_group = df.groupby([df['pdate'].dt.month, 'Rating'])['UserID'].agg(pv=np.sum) df_group.head(20) # pdate為月份 # pv # pdate Rating # 7 4.0 4 # 5.0 3 # 檢視按月份,不同評分的次數趨勢,是不行的。 # 需要將資料變換成每個評分是一列才可以實現的 # 2)使用unsack實現資料二維透視 # 目的:畫圖對比按照月份的不同評分的數量趨勢 df_stack = df_group.unstack() # pv # Rating 4.0 5.0 # pdate # 7 4 3 # unstack和stack是互逆操作 df_stack.stack().head() # pv # pdate Rating # 7 4.0 4 # 5.0 3 # 3)使用pivot簡化透視 df_group.head() # pv # pdate Rating # 7 4.0 4 # 5.0 3 df_reset = df_group.reset_index() df_reset # pdate Rating pv # 0 7 4.0 4 # 1 7 5.0 3 df_pivot = df_reset.pivot('pdate', 'Rating', 'pv') df_pivot # Rating 4.0 5.0 # pdate # 7 4 3 # pivot方法相當於對df使用set_index建立分層索引,然後呼叫unstack # 4)stack,unstack, pivot的語法 # stack:DataFrame.stack(level=-1, dropna=True),將column變成 # index,類似把橫放的書籍變成豎放,level=-1代表多層索引的最內層, # 可以通過==0,1,2指定多層索引的對應層