第3章 数据汇总与统计答案
Series、DataFrame创建,读取,统计分析。P36思考与练习1、P44思考与练习2、P48思考与练习3、P52思考与练习4、P56思考与练习5、P63综合练习题。
目录
P36思考与练习1
1、简述统计量均值和中位数的区别,如果某样本统计的均值和中位数存在较大差别,说明数据集具有什么特性?
均值即样本的平均值,是反映数据集中趋势的统计量。中位数为样本中大小处于中间的数值。中位数不受最大、最小两个极端数值的影响。
如果在一个数据集中均值与中位数差别较大则说明该样本的最大值与最小值的差别越大,数据比较分散。
2、使用Excel表格计算表3-1中由5名学生“成绩”组成的样本均值、方差、中位数和上四分位数、下四分位数。
求均值:在相应单元格中输入“=AVERAGE(G2:G6)”
求方差:在相应单元格中输入“=VAR.P(G2:G6)”
求中位数:在相应单元格中输入“=QUARTILE.INC(G2:G6,2)”
求上四分位数:在相应单元格中输入“=QUARTILE.INC(G2:G6,1)”
求下四分位数:在相应单元格中输入“=QUARTILE.INC(G2:G6,3)”
P44思考与练习2
1、创建并访问Series对象。
1)创建如下表的Series数据对象,其中a-f为索引;
a | b | c | d | e | f |
30 | 25 | 27 | 41 | 25 | 3 |
2)增加数据27,索引为g;
3)修改索引d对应的值为40;
4)查询值大于27的数据;
5)删除位置为1-3的数据。
【提示】位置1-3的索引列表,可以用 series.index[1:4] 来得到。
#1、创建并访问Series对象
from pandas import Series
#1)
S = Series([30,25,27,41,25,34],index = ['a','b','c','d','e','f'])
print(S)
#2)
#方法一:
S['g'] = 27
print(S)
#方法二:
'''
A = Series([27],index = ['g'])
S = S.append(A)
print(S)
'''
#3)
S['d'] = 40
print(S)
#4)
print(S[S.values>27])
#5)
print(S.drop(S.index[1:4])) #或S.drop(['b','c','d'])
2.创建并访问DataFrame对象。
a)创建3×3DataFrame数据对象:数据内容为1-9;行索引为字符a,b,c;列索引为字符串one,two,three;
b)查询列索引为two和three两列数据;
c)查询第0行、第2行、第0列、第2列数据;
d)筛选第1列中值大于2的所有行数据,另存为data1对象;
e)为data1添加一列数据,列索引为four,值都为10;
f)将data1所有值大于9的数据修改为8;
g)删除data1中第0行和第1行数据。
【提示】
(1)生成数据,使用numpy的arange()函数和reshape()函数;
(2)使用 data>9生成布尔型的DataFrame,用于整个DataFrame的数据过滤。
#2创建并访问DataFrame对象
from pandas import DataFrame
import numpy as np
#1)
df = DataFrame(np.arange(1,10).reshape(3,3),index = ['a','b','c'],columns = ['one','two','three'])
print(df)
#2)
print(df[['two','three']])
#3)
print(df.iloc[[0,2],[0,2]])
#4)
data1 = df.loc[df['two']>2]
print(data1)
#5)
data1['four'] = 10
print(data1)
#6)
data1[data1>9] = 8 #或者data1[data1.values>9] = 8
print(data1)
#7)
print(data1.drop(data1.index[0:2],axis = 0))
P48思考与练习3
1.创建50×7的DataFrame对象,数据为 [10,99]之间的随机整数;columns为字符a-g;将DataFrame对象保存到csv文件中。
【提示】使用NumPy的随机生成函数randint()生成数据。
#第1题
import numpy as np
from pandas import DataFrame
df = DataFrame(np.random.randint(10,100,size = (50,7)),columns = ['a','b','c','d','e','f','g'])
df.to_csv('1.csv',mode = 'w',header = True,index = False)
2. 海伦一直使用在线交友网站寻找适合的约会对象, 她将交友数据存放在datingTestSet.xls文件中。
1)从文件中读取有效数据保存到Dataframe对象中,跳过所有文字解释行;
2)列索引名设为 ['flymiles','videogame','icecream','type’];
3)显示读取到的前面5条数据;
4)显示所有'type'为'largeDoses‘的数据;
本书中所有的数据文件保存在data文件夹中,链接如下:
https://pan.baidu.com/s/1Tu__B-YfXDz_yXzbzNKB4A?pwd=sfw2
提取码:sfw2
#第二题
import pandas as pd
#1,2)
frienddata = pd.read_csv('data\datingTestSet.csv',header = None,names = ['flymiles','videogame','icecream','type'],
skiprows = 2) #此处为names定义列索引
#3)
print(frienddata[:5])
#4)
print(frienddata[frienddata['type'] =='largeDoses']) #或者frienddata.loc[frienddata['type'] =='largeDoses',: ]
P52思考与练习4
1.数据清洗。
1)从studentsInfo.xlsx 文件的“Group1”表单中读取数据;
2)将“案例教学”列数据值全改为NaN;
3)滤除每行数据中缺失3项以上(包括3项)的行;
4)滤除值全部为NaN的列;
#1、数据清洗
#1)
import pandas as pd
stu = pd.read_excel('data\studentsInfo.xlsx','Group1',index_col = 0)
print(stu)
#2)
import numpy as np
stu['案例教学'] = np.nan
print(stu)
#3)
print(stu.dropna(thresh = 7)) #总列数(9)-缺失要删除的行数(3)+1 = 7
#4)
print(stu.dropna(axis = 1,how = 'all'))
2.数据填充。
1)使用习题1的数据;
2)使用列的平均值填充“体重”和“成绩”列的NaN数据;
3)使用上一行数据填充“年龄”列的NaN数据;
4)使用“中位数”填充“生活费用”NaN数据。
【提示:】使用df[“生活费用”].median() 计算中位数。
#2、数据填充
#1)
import pandas as pd
stu = pd.read_excel('data\studentsInfo.xlsx','Group1',index_col = 0)
print(stu)
#2)
stu.fillna({'体重':stu['体重'].mean(),'成绩':stu['成绩'].mean()},inplace = True)
print(stu)
#3)
stu['年龄'].fillna(method = 'ffill',inplace = True)
print(stu)
#4)
stu.fillna({'月生活费':stu['月生活费'].median()},inplace = True)
P56思考与练习5
1. 数据合并。
1)从studentsInfo.xlsx的“Group3”页读取数据,将序号、性别、年龄项保存到data1对象;
2)从studentsInfo.xlsx的“Group3”页读取数据,将序号、身高、体重、成绩项保存到data2对象;
3)将data2合并到data1中,连接方式为内连接。
#1、数据合并
#1)
import pandas as pd
stu = pd.read_excel('data\studentsInfo.xlsx','Group3')
data1 = stu[['序号','性别','年龄']]
print(data1)
#2)
data2 = stu[['序号','身高','体重','成绩']]
print(data2)
#3)
print(pd.merge(data1,data2)) #注:how = ’inner‘可以省略,默认为内连接
2. 数据排序和排名。
1)使用练习1最后合并的数据;
2)按月生活费对数据升序排序;
3)按身高对数据降序排名,并列取值方式设置为min。
#2、数据排序与排名
#1)
import pandas as pd
stu = pd.read_excel('data\studentsInfo.xlsx','Group3')
print(stu)
#2)
print(stu.sort_values(by ='月生活费',ascending = True))
#3)
stu['身高排名'] = stu['身高'].rank(method = 'min',ascending = False)
print(stu)
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,表示两者之间几乎没有相关性。
更多推荐
所有评论(0)