Pandas应用实例(DataFrame基本操作,画图)

题目要求

  1. 利用Pandas建立学生信息二维表,包含姓名、年龄、性别、专业、个人电子设备数量和平均月支出(以一百元为单位)六类信息,至少创建10条具有代表性的记录(10分)。

  2. 显示最后三行的信息并筛选出个人电子设备超过3的学生(10分)。

  3. 利用Matplotlab绘制反映月支出和电子设备数量关系的散点图(10分)。

  4. 绘制反映姓名和年龄的柱状图(10分)。

  5. 在一个图中绘制每位同学月支出和电子设备的曲线图,并显示图例和必要的提示信息(15分)。

  6. 按照专业分组并绘制柱状图(15分)。

  7. 按照专业分组并统计不同性别的人数,绘制合适的图形(15分)。

  8. 绘制反应年龄的直方图(15分)。

答案

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

利用Pandas建立学生信息二维表,

  1. 包含姓名、年龄、性别、专业、个人电子设备数量和平均月支出(以一百元为单位)六类信息,
  2. 至少创建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, '平均月支出(百元)')

image

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()

image

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()

image

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

image

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()

image

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()

image

posted @ 2023-01-18 21:46  kingwzun  阅读(236)  评论(0编辑  收藏  举报