【数据分析-练习题】

1.现有如下图所示的两组数据,其中 A组中B列数据存在缺失值,并且该列数据为int类型,B组中的数据均为str类型。接下来,请对这些数据进行以下操作:
使用DataFrame创建这两组数据。
现在需要使用B组中的数据对A组中的缺失值进行填充并保持数据类型一致。
将合并后A组中索引名为key的索引重命名为D。

答:
import numpy as np
import pandas as pd
group_a=pd.DataFrame({'A':[2,3,5,2,3],'B':['5',np.nan,'2','3','6'],'C':[8,7,50,8,2],'key':[3,4,5,2,5]})
group_b=pd.DataFrame({'A':[3,3,3],'B':[4,4,4],'C':[5,5,5]})
print(group_a)
print(group_b)

group_a=group_a.combine_first(group_b)
group_a

group_a.rename(columns={'key':'D'})


2.现有如下图所示的学生信息,请根据图中的信息完成以下操作:
根据年级信息为分组键,对学生信息进行分组,并输出大一学生信息。
分别计算出四个年级中身高最高的同学。
计算大一学生与大三学生的平均体重。

答:

import numpy as np
import pandas as pd
students_data=pd.DataFrame({'年级':['大一','大二','大三', '大四','大二','大三', '大一','大三','大四'], '姓名':['李宏卓','李思真','张振海','赵鸿飞','白蓉','马腾飞','张晓凡','金紫萱','金烨'],
'年龄':['18','19','20','21','19','20','18','20','21'],  '身高':['175','165','178','175','160','180','167','170','185'], '体重':['65','60','70','76','55','70','52','53','73']})
data=students_data.groupby('年级')
Freshman=dict([x for x in data])['大一']
print(Freshman)

data=data.apply(max)
del data['年级']
print(data)

Junior=dict([x for x in data])['大三']
print(Freshman['体重'].apply('mean'))
print(junior['体重'].apply('mean'))

data=data.apply(max)

del data['年级']

print(data)

Junior=dict([x for x in data])['大三']

print(Freshman['体重'].apply('mean'))

print(junior['体重'].apply('mean'))

 

3.现有如图6-40所示的股票数据,根据图中的数据,完成以下需求:
使用DataFrame创建该股票数据。
以证券简称为x轴,最新价为y轴使用条形图展示,将生成的条形图图以shares_bar.png为文件名保存在桌面上。
答:
import numpy as np
import pandas as pd
stock_data=pd.DataFrame({'证券代码':['000609','000993','002615','000795','002766','000971','000633','300173','300279','000831'],'证券简称':['中迪投资','闽东电力','哈尔斯','英洛华','索菱股份','高升控股','合金投资','智慧松德','和晶科技','五矿稀土'],'最新价':['4.80','4.80','5.02','3.93','6.78','3.72','4.60','4.60','5.81','9.87'],'涨幅跌%':['10.09','10.09','10.09','10.08','10.06','10.06','10.06','10.05','10.05','10.04']})
print(stock_data)

import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
x_axis=stock_data['证券简称']
y_axis=stock_data['最新价']
plt.bar(x_axis,y_axis)
plt.savefig(r'C:\Users\admin\Desktop\shares_bar.png')
plt.show()

分析2020年2月与2019年2月相比,京东商《零基础Pythom》书销量同比增长情况,画出2019.2和2020.2每个地区同比增长情况柱状图并说明那两个地区的同比增长值最小?
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_excel('JD2019.xlsx')
df = df.set_index('日期')
df1 = pd.concat([df['2019-02'],df['2020-02']])
df1 = df1[df1['商品名称'] == '零基础学Python(全彩版)']
df1 = df1.T
x = np.array([0,1,2,3,4,5,6])
y1 = df2['2019-02-01']
df1 = pd.concat([df['2019-02'],df['2020-02']])
df1 = df1[df1[['商品名称'] == '基础教学python(全彩版)']
df1 = df1[['北京','上海','广州','成都','武汉','沈阳','西安']]
df2 = df1.t
x = np.array([0,1,2,3,4,5,6])
y1 = df2['2019-02-01']
y2 = df2['2020-02-01']
df2['rate'] = ((df2['2020-02-01'] - df2['2019-02-01']) / df2['2019-02-01']) * 100
y = df2['rate']
print(y)
width = 0.25
plt.rcParams['font.sans-serif'] = ['simHei']
plt.title('全国各地区销量及同比增场情况']
plt.ylabel('销售数量')
plt.xticks(x,['北京','上海','广州','成都','武汉','沈阳','西安'])
plt.bar(x,y1,width=width,color='orange',label='2019年2月')
plt.bar(x + width,y2,width=width,color='deepskyblue',label='2020年2月')
for a,b in zip(x,y):
    plt.text(a,b,('%.1f%%' %b),ha='center',va='bottom',fontsize=11)
plt.legend()
plt.show()
 

4.请将上述内容存储在excel文件中。
利用pandas打开上述文件,修改索引为
[100100,100101,100102,…,100108]
增加2列,一列为class,一列为computer
Class=[1班,2班,3班,1班,2班,2班,3班,1班,1班]
Computer=[98,87,76,80,54,78,98,83,65]
增加1行,100109这行的值与100105值相同。
请将chinese的缺失值填充为80, 将math缺失值填充为math最大值最小值之差,将English缺失值填充为english平均值
输出
       100101       70    72
       100105       60    67
删除重复行,并重新保存为123.csv
按照班级统计每门课程的平均值、最高分数、最低分数。
新增加一列为每位学生的总分,并对总分进行排序,按照从高到底排序
画出三个班的课程的平均值的柱状图,颜色、线条、驻点,图例都必须要有。
答:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df=pd.read_excel(r'C:\Users\Administrator\Desktop\1.xlsx',index_col=0)
df

df=df.reindex([100100,100101,100102,100103,100104,100105,100106,100107])
df

df['class'] = ['1班','2班','3班','1班','2班','2班', '1班','1班']
df['computer'] = [98, 87.76.80.54.78.98.83]
df.loc[100108] = [60.0,90.0,67.0,'2班',78.0]  //这里的值要修改!和100101相同
df

df.to_csv('E:/数据分析与可视化/4.13/123.csv')

tt=pd.read_csv('E:/数据分析与可视化/4.13/123.csv',index_col=0)
tt

df.duplicated()

df.drop_duplicates()

tt=df['Math'].max()-df['Math'].min()
ss=float(f"{df['English'].mean():.2f}")
df=df.fillna({'Chinese':90,'Math':tt,'English':ss})
df

df.iloc[[1,5],[0,2]]

df.loc[[100101,100105],['Chinese','English']]

tt.groupby('class')['Chinese','Math','English','computer'].max()

tt.groupby('class')['Chinese','Math','English','computer'].min()

tt.groupby('class')['Chinese','Math','English','computer'].mean()

tt['sum']=tt.sum(axis=1)
tt

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
x=np.arange(3)
y1=mean_tt['Chinese']
y2=mean_tt['Math']
y3=mean_tt['English']
y4=mean_tt['Computer']
bar_width=0.15
tick_label=['1班','2班','3班']
plt.bar(x,y1,bar_width,color='c',align='center',label='chinese',alpha=0.5)
plt.bar(x+bar_width,y2,bar_width,color='b',align='center',label='math',alpha=0.5)
plt.bar(x+2*bar_width,y3,bar_width,color='g',align='center',label='english',alpha=0.5)
plt.bar(x+3*bar_width,y4,bar_width,color='r',align='center',label='computer',alpha=0.5)
plt.xlabel('科目')
plt.ylabel('成绩')
plt.xticks(x+bar_width/2,tick_label)
plt.legend(loc='upper right')
plt.show()
 

5.高考分数统计
(1)一本文理科与二本文理科最高的分数线是多少?最低分数线是多少?相差多少分。
import pandas as pd
df_obj = pd.read_excel('d:/python/data5/scores.xlsx',header=[0,1],index_col=0)
df_obj

sorted_obj=df_obj.sort_index(ascending=False)
sorted_obj

sorted_obj.max()

sorted_obj.min()

result1=sorted_obj['一本分数线','文科'].max()-sorted_obj[‘一本分数线’,‘文科’].min()
result1

result2=sorted_obj['一本分数线','理科']. max()-sorted_obj[‘一本分数线’,‘理科’].min()
result2

result3=sorted_obj['一本分数线','文科']. max()-sorted_obj[‘二本分数线’,‘文科’].min()
result3    

result4=sorted_obj['二本分数线','理科']. max()-sorted_obj[‘二本分数线’,‘理科’].min()
result4

(2)今年与去年相比,一本文理科与二本文理科变化了多少分?
ser_obj1=sorted_obj['一本分数线','文科']
ser_obj1[2018]-ser_obj1[2017]

ser_obj1=sorted_obj['一本分数线','理科']
ser_obj1[2018]-ser_obj1[2017]

ser_obj1=sorted_obj['二本分数线','文科']
ser_obj1[2018]-ser_obj1[2017]

ser_obj1=sorted_obj['二本分数线','理科']
ser_obj1[2018]-ser_obj1[2017]

(3)2006-2018年近13年每科分数线的平均值
sorted_obj.describe()
 

6.画图分析某年旅游景点数据
(1)河北省总面积和旅客量位居前三的景点
(2)河北省旅客量的占比哪个最多,哪个最少

(1)
import pandas as pd
import numpy as np
# 使用read_csv()方法进行读取
scenery_file_path = open(r'd:/python/data5/风景名胜区.csv')
scenery_data = pd.read_csv(scenery_file_path)
scenery_data

# 计算‘总面积(平方公里)’的平均数,并保留一位小数
area = float("{:.1f}".format(
scenery_data['总面积(平方公里)'].mean()))
# 计算‘游客量(万人次)’平均数,并保留一位小数
tourist = float("{:.1}".format(
scenery_data['游客量(万人次)'].mean()))
# 将上述计算的平均值,使用fillna()函数,字典映射的形式进行填充
values = {"总面积(平方公里)":area,"游客量(万人次)":tourist}
scenery_data = scenery_data.fillna(value=values)
scenery_data.head


# 通过groupby()函数按“省份”一列拆分scenery_data
data = scenery_data.groupby("省份")
# 显示“河北”分组的数据
hebei_scenery = dict([x for x in data])['河北']
hebei_scenery


import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']  # 正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    # 正常显示负号
area = hebei_scenery['总面积(平方公里)'].values
tourist = hebei_scenery['游客量(万人次)'].values
# 设置尺寸
plt.figure(figsize=(12, 6))
x_num = range(0, len(area))
x_dis = [i + 0.3 for i in x_num]
plt.bar(x_num, area, color='g', width=.3, label='总面积')
plt.bar(x_dis, tourist, color='r', width=.3, label='游客量')
plt.ylabel('单位:平方公里/万人次')
plt.title('河北景点面积及游客数量')
# 设置图例
plt.legend(loc='upper right')
plt.xticks(range(0, 10),['苍岩山', '嶂石岩', '西柏坡-天桂山', 
'秦皇岛北戴河','响堂山','娲皇宫','太行大峡谷',
'崆山白云洞','野三坡','承德避暑山庄外八庙'])
plt.show()

(2)
import matplotlib.pyplot as plt
every_scenery = hebei_scenery['游客量(万人次)'].values
all_scenery = hebei_scenery['游客量(万人次)'].sum()
# 计算每个景点游客所占百分比  保留两位小数
percentage = (every_scenery/all_scenery)*100
np.set_printoptions(precision=2)
labels  = ['苍岩山', '嶂石岩', '西柏坡-天桂山', 
            '秦皇岛北戴河','响堂山','娲皇宫','太行大峡谷',
            '崆山白云洞','野三坡','承德避暑山庄外八庙']
plt.axes(aspect=1)
plt.pie(x= percentage, labels=labels, autopct='%3.2f %%',shadow=True, labeldistance=1.2, startangle = 90,pctdistance = 0.7)
plt.legend(loc='upper left')
plt.show()


7.运动员信息的分组与聚合
(1)    统计篮球运动员的平均年龄、身高、体重
(2)    统计男篮运动员的年龄、身高、体重的极差值
(3)    统计篮球运动员的体质指数(BMI值)
导入数据
import pandas as pd
file_path = open('d:/python/data5/运动员信息表.csv')
df = pd.read_csv(file_path)
df

#按项目一列进行分组
data_group = df.groupby('项目')
#输出篮球分组的信息
df_basketball = dict([x for x in data_group])['篮球']
df_basketball

(1)统计篮球运动员的平均年龄、身高、体重
groupby_sex = df_basketball.groupby('性别')
groupby_sex.mean()

info = groupby_sex.transform('mean')
info
(2)统计男篮运动员的年龄、身高、体重的极差值
#查看男篮运动员的分组
basketball_male = dict([x for x in groupby_sex])['男']
basketball_male

(3)男篮运动员的体脂指数  体质指数(BMI)= 体重(kg) 身高 2(m)
def range_data_group(arr):
    return arr.max()-arr.min()
basketball_male.agg({'年龄(岁)':range_data_group, '身高(cm)':range_data_group,'体重(kg)':range_data_group})

# 添加“体质指数”列
df_basketball['体质指数'] = 0
df_basketball

def outer(num):
    def ath_bmi(sum_bmi):
        weight=df_basketball['体重(kg)']
        height=df_basketball['身高(cm)']
        sum_bmi=weight/(height/100)**2
        return num+sum_bmi
    return ath_bmi
all_bmi = df_basketball['体质指数']
df_basketball['体质指数'] = df_basketball[['体质指数']].apply(outer(all_bmi))
df_basketball
 

8.根据 temperature 表,绘制图片,参考样张
1.与样张大致相同,但最必须要有标题、 x轴名称, y轴名称,图中必须要有温度,而且必须要有图例 
2.x轴刻度范围1-15, y抽刻度范围36-37.5
3.颜色自行指定
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
fig = plt.figure(figsize=(5,3),facecolor='yellow')
df = pd.read_excel('C:/Users/Administrator/Desktop/体温.xls')
x=df['日期']
y=df['体温']
plt.plot(x,y,color='m',linestyle='-.',marker='o',label='temperature')
plt.xlabel('2020年2月')
plt.ylabel('体温')
dates=['1日','2日','3日','4日','5日','6日','7日','8日','9日','10日','11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)
plt.yticks(np.arange(36,37.5,0.2))
plt.xlim(1,14)
plt.ylim(36,37.4)
plt.grid(color='0.5',linestyle='--',linewidth=1,axis='y')
plt.title('Temperature variation diagram',fontsize=12)
plt.legend(loc='upper right')
for a,b in zip(x,y):
plt.text(a,b+0.5,'%.1f'%b,ha='center',va='bottom',fontsize=9)


9.星巴克店铺在全球分布情况
哪些国家星巴克店铺较多
哪些城市星巴克店铺较多
星巴克店铺在我国的分布情况
import pandas as pd 
import numpy as np
from pandas import Series,DataFrame import matplotlib. pyplot as plt
plt.rcParams[ 'font. sans- serif'] = ['SimHei'] plt.rcParams['axes. unicode_minus'] = False omatplotlib inline
loop.:
starbucks = pd.read_csv("directory. csv") starbucks.head()

(1)查看星巴克旗下有哪些品牌。如果我们只关心星巴克咖啡门店,则只需获取星巴克中Brand的数据集,并查看全世界一共有多少少家星巴克门店。
In[3]:    print("星巴克旗下品牌有:\n",starbuck    s. Brand.value counts())    
coffee = starbucks[starbucks.Brand=    'Starbucks']    
print("\n",coffee.shape)

(2)查看全世界一共有多少个国家和地区开设了    星巴克门店,显示门店数量排名前    
10和后10的国家和地区。
df=starbucks.groupby(["Country"]). sizel    )    
print("全世界一共有多少个国家和地区开设    了星巴克门店:",df.size)    
df1 = df.sort values( ascending= False)
print("排名前10的国家和地区:\n",df1.hea ad(10))

星巴克门店数排名后10的国家:
print("排名后10的国家:\n",df1.tail(10))

(3)用柱状图绘制排名前10的分布情况。    
plt. rcParams['font. si    ze'] = 15    
plt.rcParams['font.fa mily'] ='SimHei' df1.head(10).plot(kir nd='bar',rot=0)
plt.title('星巴克门店    数排名前10的国家和地区')    
plt.ylabel('Store Coun nts')
plt.xlabel('Countries    and Regions')
(4)显示拥有星巴克门店数量排名前10的城市。
count_starbucks_city = coffee.City.value_counts()    
print("星巴克门店数量排名前10的城市:\n", count starbucks city.head(10))
star = starbucks.dropna(how='any' subset=['City']) count starbucks city = star City.value counts() print("全世界星巴克门店数量排名前10 的城市:\n", count starbucks city.head(10))

(5)绘制星巴克门店数前10的城市分布柱状图。
plt.figure(1,figsize =(8,6))
count_starbucks_city= star.City.value_counts() city_top10=count_starbucks_city.head(10) city_top10.plot(kind= 'bar',rot= 30)
plt.title('拥有星巴克门店最多的10个城市) plt. ylabel('Store Counts') plt.xlabel('City')
按照星巴克门店在中国的分布情况,统计排名前10的城市。
import pinyin    
#选择中国的数据
df = star[star["Country" ] = = "CN" ] df1 =df.copy()#将城市名改为小写
df1["City"] = df1["City"].apply(lambda x:x.lower())#将汉字城市名改为小写拼音,去掉"市"的拼音 
df1["City"] = df1["City"]. apply(lambda x:pinyin.get(x, format ="strip", delimiter = "")[0:-3])#统计每个城市的星巴克门店数量
df1 =df1.groupby(["City"]).size().sort_values( ascending= False) df1.head(10)

(7)绘制柱状图。
In[10]:    df1.head(10).plot(kind='bar',rot = 30)    
plt.title('中国拥有星巴克门店最多的10个城市') plt.ylabel('Store Counts') plt.xlabel('Cities')

(8)用饼状图显示星巴克门店的经营方式有哪几种。
In[11]:    plt.figure(1,figsize = (8,6    ))    
ownership =star['Ownership    Type'].value_counts()    
plt.title('星巴克门店所有权类型') ownership.plot(kind = 'pie'
 

10.有60名学生的两门课程成绩的数据文件(文件名分别为ReportCard1和ReporCard2),分别记录着学生的学号、性别以及不同课程的成绩。请将数据读入Pandas数据框,并做如下处理:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#如遇中文显示问题可加入以下代码
from pylab import mpl
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
import warnings
warnings.filterwarnings('ignore')

1)将两个数据文件按学号合并为一个数据文件,得到包含所有课程成绩的数据文件。
file_path_1 = fr'../data/ReportCard1.txt'
file_path_2 = fr'../data/ReportCard2.txt'

# 创建一个新的列名列表
new_column_names_1 = ["学号","性别","政治","语文","数学"]
new_column_names_2 = ["学号","外语","物理","化学","地理","历史"]

data_1 = pd.read_csv(file_path_1,sep="\t")
data_1.head()

# 将新的列名列表赋值给DataFrame的columns属性  
data_1.columns = new_column_names_1
data_1.head()

# 检验两个文件是否含有关联字段(学号)
print('学号' in data_1.columns)
print('学号' in data_2.columns)

# 这里的外连接主要是为了避免两个文件中“学号”不匹配,预防数据丢失
df_merged  = pd.merge(data_1, data_2, on='学号',how="outer")
df_merged.head()

# 将合并后的数据保存起来
df_merged.to_csv(fr"../data/df_merge.txt",index=False,encoding="utf-8-sig",sep="\t")

2)计算每个同学的各门课程的总成绩和平均成绩。
    # 读取数据源
df_merged = pd.read_csv(fr"../data/df_merge.txt",sep="\t")
df_merged.head()

# 判断学号是否重复
duplicates_in_A = df_merged["学号"].duplicated().any()
print(f"列'A'包含重复值吗? 经检验:{'是' if duplicates_in_A else '否'}")

# 查看多少行多少列
df_merged.shape
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值