1. 程式人生 > 其它 >Pandas_stack和pivot實現資料透視

Pandas_stack和pivot實現資料透視

"""
將列式資料變成二維交叉形式,便於分析,叫做重塑或者透視
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指定多層索引的對應層