标签:5.0 Rating 4.0 df pdate Pandas pivot stack
"""
将列式数据变成二维交叉形式,便于分析,叫做重塑或者透视
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指定多层索引的对应层
标签:5.0,Rating,4.0,df,pdate,Pandas,pivot,stack 来源: https://www.cnblogs.com/wangshuang57/p/15981266.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。