python练习题(五)

说明:以练习题的方式,学习python基础知识点,主要是数据分析方向常用的numpy、pandas、matplotlib等库对应的练习题。仅供参考,题目来源于网络,如有侵权请联系我删除。

Pandas中的层次化索引、数据转置、数据分组及运算、离散化处理等:

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

import numpy as np
import pandas as pd
data = pd.read_excel('酒店数据1.xlsx')
data.head()

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

    答:层次化索引,是指在一个轴上拥有多个索引。

           Series的层次化索引(index),DataFrame的层次化索引(index,columns)。

           本题中是将列名变为层次索引,采用set_index(),取消用reset_index()方法。也可以直接生成。

#DataFrame设置层次化索引
data = data.set_index(['类型','名字'])

#交换索引位置swaplevel()
data.swaplevel('名字','类型')

#取消索引
data = data.reset_index()
#带层次化索引的 Series
s = Series(np.arange(1,10),index=[["a","a","a","b","b","c","c","d","d"],
                                      [1,2,3,1,2,3,1,2,3]])
#带层次化索引的 DataFrame
data = DataFrame(np.arange(12).reshape(4,3),index=[["a","a","b","b"],[1,2,1,2]],
                    columns=[["A","A","B"],["Z","X","C"]])

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

#转置T
df = data.T

#获取转制后的index和columns
df.index
df.columns

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

    答:数据分组groupby技术,实现数据分组和分组运算,作用类似与子数据透视表。

#分组后计算总和
data['评分人数'].groupby(data['地区']).sum()
#分组后计算均值
data['评分人数'].groupby(data['地区']).mean()

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

#按类型分组后计算价格的均值
data['价格'].groupby(data['类型']).mean()
#按类型分组后查找各类型中价格的最大值
data['价格'].groupby(data['类型']).max()
#按类型分组后查找各类型中价格的最小值
data['价格'].groupby(data['类型']).min()

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

    答:数据离散化处理也可以称为分组、区间化,采用pd.cut(x,bins,right=True,labels=None,...)函数,其中参数x是待区间化的数据,bins就是题目中的[0,500,1000,...],labels就是题目中的[A,B,C,]。注意对应顺序,pd.cut()函数中还有其他参数,具体含义可以查看API。

data['价格'].max()  #价格最大值为12926
data['价格等级'] = pd.cut(data['价格'],[0,500,1000,12926],labels=['C','B','A'])

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

    答:合并数据集常用方法包括append(),merge(),concat()。其中最常用的是merge()。append()是在后面添加,concat()是可以将多个数据集进行批量合并,axis=0,1可以决定合并方向。

#获取评分均值并排序
s = data['评分'].groupby(data['地区']).mean().sort_values()
#最高和最低的地区的数据
df1 = data[data.地区=='屯门']
df2 = data[data.地区=='葵青']
#两种连接方法
df1.append(df2)
pd.concat([df1,df2])

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

    答:实现 三个等级的酒店数量尽量保持一致,需要采用numpy.percentile(a, q, axis)函数,其中a 输入数组,q 要计算的百分位数,在 0 ~ 100 之间,axis 沿着它计算百分位数的轴   ,二维取值0,1。

bins = np.percentile(data['评分人数'],[0,33,67,100])
data['热门等级'] = pd.cut(data['评分人数'],bins,labels=['c','b','a'])

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

data[(data.热门等级=='a')&(data.价格等级=='A')]['评分'].mean()

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

#价格最高的前5个酒店
df = data.sort_values(by ='价格',ascending=False)[0:5]
#使用stack()将DataFrame转换为了Series
df = df.stack()
#使用unstack()将Series转换为了DataFrame
df = df.unstack()

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

#数据集纵向拆分
df1 = data.loc[:, ['名字','类型','城市','地区']]
df2 = data.loc[:, ['名字','地点','评分','评分人数','价格','价格等级','热门等级']]

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

df2 = df2.sort_values(by='价格')
df2.index = range(1,len(df2)+1)

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

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

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

data.to_excel('酒店数据2.xlsx')

注:第五部分结束。如果想自己练习,可以到我的百度网盘下载原题,使用Jupyter notebook自己写python代码实现。加油哦!

百度网盘题目地址:https://pan.baidu.com/s/1A7JFRdaBYLlnFVn6xT_SOg

你可能感兴趣的:(python)