代码逐行解析
功能:读取《流浪地球》影评csv,统计评论最多的前10个城市,绘制柱状图
python
# 任务1.2:影评数量最多的十个城市情况分析
# 步骤1:初始工作。导入相关包,Pandas从"CommentInfo.csv"文件中读取电影评论数据,设置Matplotlib绘图常用参数值。
# 导包
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据
data = pd.read_csv('datasource/CommentInfo.csv', encoding='gbk')
# 设置绘图参数
plt.rcParams['font.sans-serif'] = 'SimHei'
# 步骤2:统计并取出前十个城市评论数量。
# 提出城市名称
city = data['citys'].apply(lambda x:x[2:-2])
# 城市名称为空,设置为'未知城市'
city = pd.Series(['未知城市' if i== '' else i for i in city])
# 统计十个城市评论数量
city = city.value_counts().sort_values(ascending=False)[:10]
print(city)
# 步骤3:绘制柱状图。横轴为城市,纵轴为城市对应的电影评论数量,显示前十个城市评论数据的情况。
plt.figure(figsize=(12,4))
# 绘制柱状图
plt.bar(city.index,city)
# 美化图形
plt.title('评论数量最多的十个城市')
plt.ylabel('评论数量')
plt.xticks(rotation=15)
for i,j in enumerate(city):
plt.text(i,j,j)
# 显示图形
plt.show()
逐行详细解析
# 任务1.2:影评数量最多的十个城市情况分析
# 步骤1:初始工作。导入相关包,Pandas从"CommentInfo.csv"文件中读取电影评论数据,设置Matplotlib绘图常用参数值。
# 导包
import matplotlib.pyplot as plt
导入matplotlib绘图库,简写plt,用于绘制柱状图。
import pandas as pd
导入pandas数据分析库,简写pd,用来读取csv文件、清洗和统计数据。
# 读取数据
data = pd.read_csv('datasource/CommentInfo.csv', encoding='gbk')
pd.read_csv()读取csv文件。 文件路径:
datasource/CommentInfo.csvencoding='gbk':文件中文采用gbk编码,防止中文读取乱码。 读取后数据存入DataFrame变量data。
# 设置绘图参数
plt.rcParams['font.sans-serif'] = 'SimHei'
设置matplotlib全局字体为黑体SimHei ,解决图表里中文变成方框的乱码问题。 补充:缺少
plt.rcParams['axes.unicode_minus'] = False,如果图中有负号,负号会显示成方框。
# 步骤2:统计并取出前十个城市评论数量。
# 提出城市名称
city = data['citys'].apply(lambda x:x[2:-2])
-
data['citys']:取出data里名为citys的这一列(存储用户城市信息) -
.apply():对这一列每一行数据执行后面lambda函数 -
lambda x:x[2:-2]:匿名函数,字符串切片。x[2:-2]:从下标2开始取,到倒数第2个字符为止,去掉前后多余字符,提取纯净城市名。城市名称为空,设置为'未知城市'
city = pd.Series(['未知城市' if i== '' else i for i in city])
-
列表推导式,遍历city里每一个值
i -
判断:如果
i是空字符串'',替换文字为未知城市;否则保留原有城市名称 -
pd.Series():把处理后的列表重新转为pandas序列Series,方便后续统计统计十个城市评论数量
city = city.value_counts().sort_values(ascending=False)[:10]
-
.value_counts():统计每个城市出现次数(即该城市评论数量),默认降序排列 -
.sort_values(ascending=False):再次指定降序(数量从大到小) -
[:10]:切片,取前10条数据,也就是评论最多的10个城市 -
结果存入city,此时
city.index是城市名,city的值是评论数量print(city)
在控制台打印这个统计结果,方便查看前10城市和对应评论数量,用于调试。
# 步骤3:绘制柱状图。横轴为城市,纵轴为城市对应的电影评论数量,显示前十个城市评论数据的情况。
plt.figure(figsize=(12,4))
创建画布,设置画布大小:宽度12英寸,高度4英寸。
# 绘制柱状图
plt.bar(city.index,city)
plt.bar()绘制柱状图 第一个参数
city.index:x轴,城市名称 第二个参数city:柱子高度,对应评论数量
# 美化图形
plt.title('评论数量最多的十个城市')
设置图表的大标题。
plt.ylabel('评论数量')
设置y轴(纵轴)标签文字。
plt.xticks(rotation=15)
x轴刻度文字旋转15度,防止城市名字太长文字重叠挤在一起。
for i,j in enumerate(city):
plt.text(i,j,j)
-
enumerate(city):同时拿到索引i,和评论数量j -
plt.text(x,y,文本):在坐标(i,j)位置添加文字 -
作用:在每根柱子顶端标注对应的评论数字 小缺陷:没有设置水平对齐
ha="center",文字不会居中对齐柱子。显示图形
plt.show()
弹出窗口,展示绘制完成的图表。
代码缺陷补充(考试重点)
- 缺少
plt.rcParams['axes.unicode_minus'] = False,存在负号乱码风险 plt.text(i,j,j)缺少ha='center',数字不在柱子正上方- 保存图片代码
plt.savefig()没有写,如果需要导出图片要添加 city.value_counts()本身默认降序,.sort_values(ascending=False)属于重复操作,可以省略
整体执行流程
读取csv数据 → 切片提取城市名 → 空值替换为未知城市 → 统计城市评论频次,取TOP10 → 创建画布画柱状图 → 设置标题坐标轴,柱子顶部写数字 → 展示图片
要不要我帮你修复这段代码,补齐缺失参数,生成一份无bug完整版?