Pandas应用实例(DataFrame基本操作,画图)
题目要求
-
利用Pandas建立学生信息二维表,包含姓名、年龄、性别、专业、个人电子设备数量和平均月支出(以一百元为单位)六类信息,至少创建10条具有代表性的记录(10分)。
-
显示最后三行的信息并筛选出个人电子设备超过3的学生(10分)。
-
利用Matplotlab绘制反映月支出和电子设备数量关系的散点图(10分)。
-
绘制反映姓名和年龄的柱状图(10分)。
-
在一个图中绘制每位同学月支出和电子设备的曲线图,并显示图例和必要的提示信息(15分)。
-
按照专业分组并绘制柱状图(15分)。
-
按照专业分组并统计不同性别的人数,绘制合适的图形(15分)。
-
绘制反应年龄的直方图(15分)。
答案
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
利用Pandas建立学生信息二维表,
- 包含姓名、年龄、性别、专业、个人电子设备数量和平均月支出(以一百元为单位)六类信息,
- 至少创建10条具有代表性的记录(10分)。
#建立学生信息二维表
students = pd.DataFrame( columns=['姓名', '年龄', '性别', '专业', '个人电子设备数量', '平均月支出(百元)'])
print(students)
Empty DataFrame
Columns: [姓名, 年龄, 性别, 专业, 个人电子设备数量, 平均月支出(百元)]
Index: []
#为了防止测试过程中数据量一直增加,这里先清空下数据
students.drop(students.index,inplace=True)
#通过loc新增数据,索引为DataFRame的长度
students.loc[len(students.index)] = ['小王', 20, "男","软件工程", 5, 10.20]
students.loc[len(students.index)] = ['小屋', 21, "男","计算机科学与技术", 3, 6.24]
students.loc[len(students.index)] = ['大黑', 22, "男","软件工程", 3, 7.40]
students.loc[len(students.index)] = ['张三', 21, "男","计算机科学与技术", 2, 7.25]
students.loc[len(students.index)] = ['李四', 20, "男","大数据", 3, 6.34]
students.loc[len(students.index)] = ['小静', 21, "女","大数据", 3, 8.34]
students.loc[len(students.index)] = ['小沈', 20, "男","大数据", 3, 6.64]
students.loc[len(students.index)] = ['小霍', 20, "男","大数据", 3, 7.08]
students.loc[len(students.index)] = ['小苌', 20, "男","计算机科学与技术", 3, 7.20]
students.loc[len(students.index)] = ['大费', 19, "女","计算机科学与技术", 4, 8.45]
students.loc[len(students.index)] = ['王五', 20, "男","计算机科学与技术", 3, 6.42]
students.loc[len(students.index)] = ['老杜', 20, "男","软件工程", 4, 7.33]
students.loc[len(students.index)] = ['小怡', 20, "女","软件工程", 4, 9.53]
# 强制类型转换,便于后面数据分析
students[['年龄', '个人电子设备数量']] =students[['年龄', '个人电子设备数量']].astype(int)
students[['平均月支出(百元)']] =students[['平均月支出(百元)']].astype(float)
print(students)
姓名 年龄 性别 专业 个人电子设备数量 平均月支出(百元)
0 小王 20 男 软件工程 5 10.20
1 小屋 21 男 计算机科学与技术 3 6.24
2 大黑 22 男 软件工程 3 7.40
3 张三 21 男 计算机科学与技术 2 7.25
4 李四 20 男 大数据 3 6.34
5 小静 21 女 大数据 3 8.34
6 小沈 20 男 大数据 3 6.64
7 小霍 20 男 大数据 3 7.08
8 小苌 20 男 计算机科学与技术 3 7.20
9 大费 19 女 计算机科学与技术 4 8.45
10 王五 20 男 计算机科学与技术 3 6.42
11 老杜 20 男 软件工程 4 7.33
12 小怡 20 女 软件工程 4 9.53
2. 显示最后三行的信息并筛选出个人电子设备超过3的学生(10分)。
print("最后三行的信息")
print(students.tail(3))
print("个人电子设备超过3的学生")
print(students[students['个人电子设备数量'] >3])
最后三行的信息
姓名 年龄 性别 专业 个人电子设备数量 平均月支出(百元)
10 王五 20 男 计算机科学与技术 3 6.42
11 老杜 20 男 软件工程 4 7.33
12 小怡 20 女 软件工程 4 9.53
个人电子设备超过3的学生
姓名 年龄 性别 专业 个人电子设备数量 平均月支出(百元)
0 小王 20 男 软件工程 5 10.20
9 大费 19 女 计算机科学与技术 4 8.45
11 老杜 20 男 软件工程 4 7.33
12 小怡 20 女 软件工程 4 9.53
3. 利用Matplotlab绘制反映月支出和电子设备数量关系的散点图(10分)。
#获取数据
x=students["平均月支出(百元)"].values
y=students["个人电子设备数量"].values
#画图
plt.scatter(x,y,alpha=0.5,s=100)
#优化图的显示
plt.xticks(np.arange(int(min(x)-1), int(max(x)+2), 1))#设置x轴刻度
plt.yticks(np.arange(int(min(y)-1), int(max(y)+2), 1))#设置y轴刻度
plt.title("月支出和电子设备数量关系的散点图")#设置标题
plt.xlabel("个人电子设备数量") # x轴的标签
plt.ylabel("平均月支出(百元)") # y轴的标签
Text(0, 0.5, '平均月支出(百元)')
4. 绘制反映姓名和年龄的柱状图(10分)。
# 使Matplotlab能显示中文
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
#设置整个画布的大小
fig = plt.figure(figsize=(12,4))
#设置子图1:题意要求的柱状图
plt.subplot(121)
#获取数据
x=students["姓名"].values
y=students["年龄"].values
#画图
plt.bar(x,y)
#优化图的显示
plt.title("姓名和年龄的柱状图")
plt.yticks(np.arange(15, 26, 1))#设置y轴刻度
plt.xlabel("姓名") # x轴的标签
plt.ylabel("年龄") # y轴的标签
#因为大学生年龄一般不低于15岁、不高于25岁,为了数据更直观,故设置刻度从15开始
plt.ylim((15,25))
#设置子图1:各年龄比例饼图
plt.subplot(122)
#获取数据
xx=students["年龄"].value_counts()
labels=students["年龄"].value_counts().index
#画饼图
patches,l_text,p_text =plt.pie(xx,labels=labels,autopct='%.1f%%')
#优化图的显示
plt.title("各年龄比例饼图")#设置标题
#设置l_texts饼图外部文本的大小
for t in l_text:
t.set_size(20)
#设置p_texts饼图内部文本的大小
for t in p_text:
t.set_size(15)
#设置图例
plt.legend(patches,labels,loc="right",bbox_to_anchor=(1,0,0.3,1))
#展示图
plt.show()
5. 在一个图中绘制每位同学月支出和电子设备的曲线图,并显示图例和必要的提示信息(15分)。
# 调用实现插值的模块
from scipy import interpolate
#获取数据
# 利用姓名的长度生成一个数组,表示x轴的值,用于插值
xx=students["姓名"].values
x = np.array([num for num in range(len(xx))])
# 获取y轴的两个参数
y_money=np.array(students["平均月支出(百元)"].values)
y_quantity=np.array(students["个人电子设备数量"].values)
#插值数据
# 生成插值后的x轴值,表示生成从0到len(xx)-1间步长为0.1的数
xnew = np.arange(0, len(xx)-1, 0.1)
#实现函数func,利用3阶B样条曲线插值
func_money = interpolate.interp1d(x, y_money, kind='cubic')
func_quantity = interpolate.interp1d(x, y_quantity, kind='cubic')
# 利用xnew和func函数生成ynew,xnew的数量等于ynew数量
ynew_money = func_money(xnew)
func_quantity = func_quantity(xnew)
# 画图部分
# 原数据的散点图
plt.scatter(xx, y_money)
plt.scatter(xx, y_quantity)
# 拟合之后的平滑曲线图
l1=plt.plot(xnew, ynew_money, label='平均月支出(百元)',color="g")
l2=plt.plot(xnew, func_quantity,label='个人电子设备数量',color="r")
#优化图的显示
# 设置图例位置
plt.legend(loc='upper center')
plt.xlabel("姓名") # x轴的标签
plt.ylabel("数量") # y轴的标签
plt.yticks(np.arange(0, max(max(y_money),max(y_quantity))+2, 1))
plt.title("每位同学月支出和电子设备的曲线图")
# 展示图
plt.show()
6. 按照专业分组并绘制柱状图(15分)。
# 分组
# 按照专业分组,获取数据的平均值
vals = students.groupby("专业").mean()
# 展示获取的数据
print(vals)
# 画图
# 利用数据画出柱状图
p1=vals.plot.barh(width=0.9)
# 优化图
plt.legend(loc='upper right')# 设置图例位置
plt.xticks(np.arange(0, 30, 2))#设置x轴刻度
plt.xlabel("数量") # x轴的标签
plt.ylabel("专业") # y轴的标签
plt.title("不同的专业的年龄,设备数量,平均月支出平均值的柱状图")#设置标题
# 展示图
plt.show()
年龄 个人电子设备数量 平均月支出(百元)
专业
大数据 20.25 3.0 7.100
计算机科学与技术 20.20 3.0 7.112
软件工程 20.50 4.0 8.615
7. 按照专业分组并统计不同性别的人数,绘制合适的图形(15分)。
# 分组
# 按照专业和性别两个属性并列分组
vals = students.groupby(["专业","性别"]).size().unstack()
# 画图
# 利用数据画出柱状图
vals.plot.barh()
# 优化图
plt.legend(loc='upper right')# 设置图例位置
plt.title("不同专业男女人数统计柱状图")#设置标题
plt.xlabel("数量") # x轴的标签
plt.ylabel("专业") # y轴的标签
# 展示图
plt.show()
8. 绘制反应年龄的直方图(15分)。
#获取数据
vals = students["年龄"].values
# 绘图
# 年龄的频数直方图
plt.hist(vals,color = 'steelblue', edgecolor = 'k')
#优化图
plt.tick_params(top='off', right='off')# 去除图形顶部边界和右边界的刻度
plt.title("年龄的频数直方图")#设置标题
plt.xlabel("年龄") # x轴的标签
plt.ylabel("频数") # y轴的标签
# 显示图形
plt.show()