本书中所有的数据文件保存在data文件夹中,链接如下:
https://pan.baidu.com/s/1Tu__B-YfXDz_yXzbzNKB4A?pwd=sfw2
提取码:sfw2
P63综合练习题
1.根据某系的实验教学计划,完成以下分析:
1)读取DataScience.xlsx文件数据,创建为DataFrame数据对象;
#1)
import pandas as pd
df = pd.read_excel('Data\DataScience.xls')
2)查询实验教学计划的基本内容及总数(df.index,df.columns);
#2)
print(df.index)
print(df.columns)
3)查询实验教学计划中是否含有NaN数据?将含有NaN数据的行导出为数据文件pre.csv,判断采用何种数据清洗模式:填充、删除或手工填充;
#3)
print(df.isnull().any()) #axis默认为0,按列查找
df[df.isnull().any(axis = 1)].to_csv('pre.csv',mode = 'w')
df.dropna(how = 'all',inplace = True) #删除全部值都为Nan的行(默认按行)
df.drop_duplicates(inplace = True) #删除重复的数据
df.fillna(method = 'ffill',inplace = True) #经判断,采用前一行数据填充
4)查询“课程名称”、“实验项目名称”、“实验类型”和“二级实验室名称”四列数据内容;
print(df[['课程名称','实验项目名称','实验类型','二级实验室名称']])
5)统计每门课程的实验课时数;
#5)
#方法一
print(df.groupby('课程名称').aggregate({'实验课时数':np.sum}))
#方法二
print(df.groupby('课程名称')['实验课时数'].sum()) #分组并按指定列进行数据计算
#方法三
print(df.groupby('课程名称')['实验课时数'].apply(sum)) #运用apply函数进行计算
6)统计每周开设各门课程的实验课时数;
#6)
#方法一
print(df.groupby(['周次','课程名称']).aggregate({'实验课时数':np.sum})) #或df.groupby(['周次','课程名称']).aggregate({'实验课时数':['sum']})
#方法二
print(df.groupby(['周次','课程名称'])['实验课时数'].sum())
#方法三
print(df.groupby(['周次','课程名称'])['实验课时数'].apply(sum))
7)统计每门课程的实验类型分布(crosstab);
#7)
print(pd.crosstab(df['课程名称'],df['实验类型']))
8)统计每个班级的实验课课表;
#8)
#方法一
print(df[['班级','周次','星期','节次','课程名称','实验项目名称','实验课时数','实验类型','班级人数','二级实验室名称','实验地点门牌号']].sort_values(by = ['班级','周次','星期','节次'],ascending = True))
#方法二
for name,group in df.sort_values(by = ['班级','周次','星期','节次'],ascending =True).groupby(['班级']):
print(name)
print(group)
9)分析各二级实验室承担的实验课时数;
print(df.groupby(['二级实验室名称','周次']).aggregate({'实验课时数':np.sum}))
print(pd.crosstab(df['二级实验室名称'],df['实验课时数']))
10)分析各二级实验室能够支持的实验类型。
#方法一:
print(df.groupby('二级实验室名称')['实验类型'].unique())
#方法二:
print(pd.crosstab(df['二级实验室名称'],df['实验类型']))
#方法三:
print(df[['二级实验室名称','实验类型']].drop_duplicates().sort_values(by = ['二级实验室名称','实验类型']))
#方法四
df1 = df[['二级实验室名称','实验类型']].drop_duplicates()
for name,group in df1.groupby('二级实验室名称'):
print(name)
print(group)
2.根据银行储户的基本信息,完成以下分析。
1)从“bankpep.csv”文件中读取用户信息。
#第2题
import pandas as pd
import numpy as np
#1)
bankpep_data = pd.read_csv('data/bankpep.csv')
2)查看储户的总数,以及居住在不同区域的储户数。
#2)
#求储户总数的四种方法
#方法一:统计id总数来求储户总数
print(bankpep_data['id'].count())
#方法二:count()函数
print(bankpep_data.count())
#方法三:info()函数
print(bankpep_data.info())
#方法四:计算index
print(bankpep_data.index)
#求不同区域的储户数
print(bankpep_data.groupby('region')['id'].count())
3)计算不同性别储户收入的均值和方差。
#3)
print(bankpep_data.groupby(['sex']).aggregate({'income':['mean','var']}))
#或者写成bankpep_data.groupby(['sex']).aggregate({'income':[np.mean,np.var]})
4)统计接受新业务的储户中各类性别、区域的人数。
#4)
#方法一
print(bankpep_data.groupby(['sex','region'])['pep'].count())
#方法二
print(bankpep_data[['pep','sex','region']].groupby(['sex','region']).count())
5)将存款账户、接受新业务的值转化为数值型。
#5)
#三种方法取一种方法就好。
#方法一
bankpep_data[['save_act','pep']] = np.where(bankpep_data[['save_act','pep']] =='YES',1,0)
print(bankpep_data)
#方法二
bankpep_data.loc[bankpep_data['save_act'] =='YES',['save_act']] = 1
bankpep_data.loc[bankpep_data['save_act'] =='NO',['save_act']] = 0
bankpep_data.loc[bankpep_data['pep'] =='YES',['pep']] = 1
bankpep_data.loc[bankpep_data['pep'] =='NO',['pep']] = 0
print(bankpep_data)
#方法三:map函数映射
set_map = {'YES':1,'NO':0}
bankpep_data['save_act'] = bankpep_data['save_act'].map(set_map) #map函数不能多列同时进行
bankpep_data['pep'] = bankpep_data['pep'].map(set_map)
print(bankpep_data)
6)分析收入、存款账户与接收新业务之间的关系。
#6)
print(bankpep_data[['income','save_act','pep']].corr().round(2)) #保留两位小数
由运行结果可知,“收入(income)”与“存款账户(save_act)”的相关系数r为0.27,“收入(income)”与“接受新业务(pep)”的相关系数r为0.22,表示它们两者之间都存在一定程度的相关性。而“存款账户(save_act)”与“接受新业务(pep)”的相关系数r为-0.07,r值接近于0,表示两者之间几乎没有相关性。