Python数据分析三剑客学习笔记Day5——pandas包的使用:数据重塑和轴向旋转,数据分组,分组运算,离散化处理,合并数据集

本文是视频Python数据分析三剑客 数学建模基础 numpy、pandas、matplotlib的学习笔记。
————————————————————————————————————————————————————

目录

数据重塑和轴向旋转

层次化索引

层次化索引可以使我们在一个轴上拥有多个索引

Series的层次化索引:

s=pd.Series(np.arange(1,10),index=[['a','a','a','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,3]])
s
a  1    1
   2    2
   3    3
b  1    4
   2    5
c  3    6
   1    7
d  2    8
   3    9
dtype: int32
s.index
MultiIndex([('a', 1),
            ('a', 2),
            ('a', 3),
            ('b', 1),
            ('b', 2),
            ('c', 3),
            ('c', 1),
            ('d', 2),
            ('d', 3)],
           )
s['a']
1    1
2    2
3    3
dtype: int32

切片操作:

s['a':'c']
a  1    1
   2    2
   3    3
b  1    4
   2    5
c  3    6
   1    7
dtype: int32
内层选取
s[:,1]#内层选取
a    1
b    4
c    7
dtype: int32
s['c',1]
7

通过unstack方法将series变成DataFrame

s.unstack()

在这里插入图片描述

通过stack方法复原

s.unstack().stack()

在这里插入图片描述

DataFrame的层次化索引

设置行列索引

data=pd.DataFrame(np.arange(12).reshape(4,3),index=[['a','a','b','b'],[1,2,1,2]],columns=[['A','A','B'],['x','y','z']])
data

在这里插入图片描述

选取列

data['A']

在这里插入图片描述

data.columns.names=['col1','col2']#设置列索引名称
data.index.names=['row1','row2']#设置行索引名称
data

在这里插入图片描述

交换内外层索引

data.swaplevel('row1','row2')

在这里插入图片描述

尝试将电影数据处理成多层索引结构

df.index
Int64Index([    0,     1,     2,     3,     4,     5,     6,     7,     8,
                9,
            ...
            38152, 38153, 38154, 38155, 38156, 38157, 38158, 38159, 38160,
            38161],
           dtype='int64', length=38162)

把产地和年代同时设为索引,产地为外层索引,年代为内层索引

set_index可以把列变为索引

df=df.set_index(['产地','年代'])
df

在这里插入图片描述

reset_index将索引变成列

每个索引都是一个元组

df.index[0]
('美国', 1994)

获取所有的美国电影,因为产地已经成为索引,用.loc方法

df.loc['美国']

在这里插入图片描述

df=df.swaplevel('产地','年代')
df

在这里插入图片描述
获取1994年的电影

df.loc[1994]

在这里插入图片描述

取消层次化索引

使用reset_index()函数

df=df.reset_index()
df[:5]

在这里插入图片描述

数据旋转

行列转化:以前五部电影为例

data=df[:5]
data

在这里插入图片描述
用.T操作可以使数据行列转换(类似于矩阵的转置)

data.T

在这里插入图片描述

dataframe可以使用stack和unstack,转化为层次化索引的series

data.stack()
0  年代                     1994
   产地                       美国
   名字                   肖申克的救赎
   投票人数                 692795
   类型                    剧情/犯罪
   上映时间    1994-09-10 00:00:00
   时长                      142
   评分                      9.6
   首映地点                 多伦多电影节
1  年代                     1957
   产地                       美国
   名字                     控方证人
   投票人数                  42995
   类型                 剧情/悬疑/犯罪
   上映时间    1957-12-17 00:00:00
   时长                      116
   评分                      9.5
   首映地点                     美国
2  年代                     1997
   产地                      意大利
   名字                    美丽人生 
   投票人数                 327855
   类型                 剧情/喜剧/爱情
   上映时间    1997-12-20 00:00:00
   时长                      116
   评分                      9.5
   首映地点                    意大利
3  年代                     1994
   产地                       美国
   名字                     阿甘正传
   投票人数                 580897
   类型                    剧情/爱情
   上映时间    1994-06-23 00:00:00
   时长                      142
   评分                      9.4
   首映地点                  洛杉矶首映
4  年代                     1993
   产地                     中国大陆
   名字                     霸王别姬
   投票人数                 478523
   类型                 剧情/爱情/同性
   上映时间    1993-01-01 00:00:00
   时长                      171
   评分                      9.4
   首映地点                     香港
dtype: object
data.stack().unstack()

在这里插入图片描述

数据分组,分组运算

GroupBy技术:实现数据的分组,分组运算,作用类似于数据透视表

按照电影的产地进行分组

先定义一个分组变量group

group=df.groupby(df['产地'])

查看类型:

type(group)
pandas.core.groupby.generic.DataFrameGroupBy

可以计算分组后的各个统计量

计算平均值
group.mean()

在这里插入图片描述

求和
group.sum()

在这里插入图片描述

计算每年的平均评分

df['评分'].groupby(df['年代']).mean()
年代
1888    7.950000
1890    4.800000
1892    7.500000
1894    6.633333
1895    7.575000
          ...   
2013    6.375974
2014    6.249384
2015    6.121925
2016    5.834524
2018    6.935687
Name: 评分, Length: 127, dtype: float64

只会对数值变量进行分组运算!!!

df['年代']=df['年代'].astype('str')
df.groupby(df['产地']).mean()

在这里插入图片描述
求中值

df.groupby(df['产地']).median()

在这里插入图片描述

传入多个分组变量

df.groupby([df['产地'],df['年代']]).mean()

在这里插入图片描述

获得每个地区,每一年的评分的均值
group=df['评分'].groupby([df['产地'],df['年代']])
means=group.mean()
means

在这里插入图片描述

series通过unstack方法转化为DataFrame,没有数据会产生缺失值

means.unstack().T

在这里插入图片描述

离散化处理

在实际数据分析中,对某些数据我们往往并不关心数据的绝对取值,而只关心它所处的区间或等级。
比如可以把评分9分及以上的电影定义为A级,7—9分定义为B级等等

离散化也可以叫做分组,区间化,可以借助函数cut()实现

pd.cut()函数

pd.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)

参数解释:

x:需要离散化的对象,一般为数值,series,Dataframe对象
bins:分组的依据
right:左区间开闭情况
include_lowest:右区间开闭情况
labels:是否用标记替代分组取值
retbins:返回x对应的bins的列表
precision:设置精度

参考:pd.cut()参数详解

用评分等级将数据分组

labels=['E','D','C','B','A']
df['评分等级']=pd.cut(df['评分'],[0,3,5,7,9,10],labels=['E','D','C','B','A'])
df

在这里插入图片描述

根据投票人数来刻画电影热门

同样可以根据投票人数来刻画电影热门,投票越多的热门程度越高

bins=np.percentile(df['投票人数'],[0,20,40,60,80,100])
df['热门程度']=pd.cut(df['投票人数'],bins,labels=['E','D','C','B','A'])
df

在这里插入图片描述
关于np.percentile()函数看这里

离散化数据的应用:

找出大烂片!

大烂片:投票人数很多,但评分很低

df[(df['热门程度']=='A')&(df['评分等级']=='E')]

在这里插入图片描述

找出高分冷门电影!

df[(df['热门程度']=='E')&(df['评分等级']=='A')]

在这里插入图片描述

数据保存

df.to_excel('movie_data3.xlsx')

合并数据集

1. append()方法

先把数据集拆分为多个,再进行合并

df_usa=df[df.产地=='美国']
df_china=df[df.产地=='中国大陆']
df_china.append(df_usa)

在这里插入图片描述

2. merge()方法

选6部热门电影

df1=df.loc[:5]
df1

在这里插入图片描述

df2=df.loc[:5][['名字','产地']]
df2['票房']=[123456,123545,486213,45684,1213546,15484]
df2

在这里插入图片描述

df2=df2.sample(frac=1)
df2

在这里插入图片描述

df2.index=range(len(df2))
df2

在这里插入图片描述

将df1和df2合并

pd.merge(df1,df2,on='名字')

在这里插入图片描述
因为两个集都存在产地,故合并后有两个产地信息

3. concat()方法

可将多个数据集进行批量合并

df1=df[:10]
df2=df[100:110]
df3=df[200:210]
dff=pd.concat([df1,df2,df3])#axis默认为0,在行上进行修改,为1,在列上进行修改
dff

在这里插入图片描述
在这里插入图片描述

第五次课作业

(1)读取数据。读取之前作业保存的“酒店数据1.xlsx”

df=pd.read_excel("酒店数据1.xlsx",index_col=0)
df

在这里插入图片描述

(2)将“类型”和“名字”设置为层次化索引,并交换索引的位置。然后将层次化索引取消。

df=df.set_index(['类型','名字'])

在这里插入图片描述

df.swaplevel('类型','名字')

在这里插入图片描述

df=df.reset_index()
df

在这里插入图片描述

(3)将数据集转置,获取转制后的index和columns。

df.T

在这里插入图片描述

df.T.index
df.T.columns

在这里插入图片描述

(4)用Groupby方法来计算每个地区的评分人数的总和以及均值。

df['评分人数'].groupby(df['地区']).mean()

在这里插入图片描述

df['评分人数'].groupby(df['地区']).sum()

在这里插入图片描述

(5)用Grouby方法计算每个类型的平均价格,最高价和最低价。

df['价格'].groupby(df['类型']).mean()

在这里插入图片描述

df['价格'].groupby(df['类型']).min()

在这里插入图片描述

df['价格'].groupby(df['类型']).max()

在这里插入图片描述

(6)数据离散化,按照价格将酒店分为3个等级,0-500为C,500-1000为B,大于1000为A,列名设置为“价格等级”。

df['价格等级']=pd.cut(df['价格'],[0,500,1000,df['价格'].max()],labels=['C','B','A'])
df

在这里插入图片描述

(7)获取评分均值最高和最低的地区的数据,分别使用append和concat方法将获取的两个数据集合并。

df['评分'].groupby(df['地区']).mean()

在这里插入图片描述

df_tm=df[df['地区']=='屯门']
df_kq=df[df['地区']=='葵青']
df_tm.append(df_kq)

在这里插入图片描述

df_tm=df[df['地区']=='屯门']
df_kq=df[df['地区']=='葵青']
dff=pd.concat([df_tm,df_kq])
dff

(8)数据离散化,按照评分人数将酒店平均分为3个等级,三个等级的酒店数量尽量保持一致。评分人数最多的为A,最少的为C。列名设置为“热门等级”。

df['热门等级']=pd.cut(df['评分人数'],np.percentile(df['评分人数'],[0,33,66,100]),labels=['C','B','A'])
df

在这里插入图片描述

(9)选出评分人数为A,价格也为A的酒店数据,计算其平均评分。

df[(df['热门等级']=='A')&(df['价格等级']=='A')]

在这里插入图片描述

df[(df['热门等级']=='A')&(df['价格等级']=='A')].mean()

在这里插入图片描述

(10)取价格最高的5个酒店的数据,使用stack和unstack方法实现dataframe和Series之间的转换。

df1=df.sort_values('价格',ascending=False)[:5]
df1.stack()

在这里插入图片描述

df1.stack().unstack()

在这里插入图片描述

(11)纵向拆分数据集,分为df1和df2,df1包含名字,类型,城市,地区,df2包含名字,地点,评分,评分人数,价格,价格等级,热门等级。

df1=df.loc[:][['名字','类型','城市','地区']]
df1

在这里插入图片描述

df2=df.loc[:][['名字','地点','评分','评分人数','价格','价格等级','热门等级']]
df2

在这里插入图片描述

(12)将df2按照价格进行排序,重新设置df2的索引。索引值等于价格排名。

df2.sort_values('价格',ascending=False)
df2.index=range(len(df2))
df2

在这里插入图片描述

(13)使用merge方法将df1和df2合并。

pd.merge(df1,df2,on='名字')

在这里插入图片描述

(14)将合并后的数据集保存数据到“酒店数据2.xlsx”。

df.to_excel('酒店数据22.xlsx')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值