pandas的stack和pivot实现数据透视

本文介绍了如何利用Python的pandas库中的stack和pivot函数进行数据透视操作。通过实例展示了如何将宽格式数据转换为长格式,以及如何通过pivot函数重塑数据以进行更有效的分析。配合三张图片,清晰地解释了这两个函数在数据处理过程中的应用。
摘要由CSDN通过智能技术生成
import pandas as pd 
import numpy as np
import os 
%matplotlib inline
os.chdir(r"C:\Users\Hans\Desktop\data_analysis\test_data\movie")
df = pd.read_csv("ratings.dat",sep = "::",engine="python",header=None,names=['UserID','MoiveID','Rating','Timestamp'])
##names="USserID::MoiveID::Rating::Timestamp".split("::")也可以这么写
df.head()
UserIDMoiveIDRatingTimestamp
0111935978300760
116613978302109
219143978301968
3134084978300275
4123555978824291
df["pdate"] = pd.to_datetime(df["Timestamp"],unit='s')
#Timestamp本来是秒的形式,所以unit='s'表示时间是秒的形式,to_datetime就是将秒变成天
df.head()
UserIDMoiveIDRatingTimestamppdate
01119359783007602000-12-31 22:12:40
1166139783021092000-12-31 22:35:09
2191439783019682000-12-31 22:32:48
31340849783002752000-12-31 22:04:35
41235559788242912001-01-06 23:38:11
#实现数据统计
df_group = df.groupby([df['pdate'].dt.month,"Rating"])["UserID"].agg({'pv':np.sum})
df_group.head()
#[df['pdate'].dt.month,"Rating"],按照月份和"Rating"来分组的,分组后
C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:2: FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version
pv
pdateRating
112613452
25294359
312273331
416452340
59580889
df_month = df['pdate'].dt.month#直接获取时间序列中的月份***,非常有用
df_month.head(6)
0    12
1    12
2    12
3    12
4     1
5    12
Name: pdate, dtype: int64
df_day = df['pdate'].dt.day
df_day.head(6)
0    31
1    31
2    31
3    31
4     6
5    31
Name: pdate, dtype: int64
df_group
pv
pdateRating
112613452
25294359
312273331
416452340
59580889
211608795
23747792
38608216
410941690
55819374
311344378
22772172
36156512
46911661
53228406
414397883
210147641
325330546
430406281
518070625
5124893943
241021601
399671422
4138699142
598385825
6115896973
231940801
375297592
4109067096
572816021
7122506252
244079974
3118016191
4163188814
5104777329
8142290096
280215303
3196812819
4250299153
5165391463
9110185866
219751997
349514561
466638484
543733790
1016825621
214936083
337937741
449413212
531949765
11129762500
255254306
3133879416
4181288004
5118358977
1215474475
211043533
325870578
433351106
519000303
#画图,要画图,画图对比按照月份的不同评分的数量趋势
df_stack = df_group.unstack()
df_stack
#stack简单说就是把columns转成index
#unstack就是把index转成columns
pv
Rating12345
pdate
12613452529435912273331164523409580889
2160879537477928608216109416905819374
313443782772172615651269116613228406
4439788310147641253305463040628118070625
524893943410216019967142213869914298385825
615896973319408017529759210906709672816021
72250625244079974118016191163188814104777329
84229009680215303196812819250299153165391463
91018586619751997495145616663848443733790
10682562114936083379377414941321231949765
112976250055254306133879416181288004118358977
12547447511043533258705783335110619000303
df_stack.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x22b9c9941d0>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wbv5G0Qk-1601386327108)(output_7_1.png)]

df_group.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x22b9d770470>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Pf0Amnx-1601386327112)(output_8_1.png)]

#上两图采用“数据透视函数”pivot来进行
#首先将df_group换成一个正常的表,去除多级索引的格式
df_01 = df_group.reset_index()#重新设置索引即可
df_01.head()
pdateRatingpv
0112613452
1125294359
21312273331
31416452340
4159580889
#数据透视
df_pivot = df_01.pivot('pdate','Rating','pv')#piovt里的参数按顺序,分别是x轴,y轴,值
df_pivot.head()
Rating12345
pdate
12613452529435912273331164523409580889
2160879537477928608216109416905819374
313443782772172615651269116613228406
4439788310147641253305463040628118070625
524893943410216019967142213869914298385825
df_pivot.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x22b9ca55748>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RdvEtTa-1601386327122)(output_11_1.png)]

'''
#stack简单说就是把columns转成index
#unstack就是把index转成columns

stack语法:
DataFrame.stack(level = -1,dropna=True),level = -1 表示多层索引的最内层(注意是负一),可以通过==0、1、2指定多层索引的对应层

pivot语法:
DataFrame.pivot(index = None,columns = None,values = None),指定了三个参数,如果不写index。。。就默认按ratings.csv顺序



'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值