
一、代码逐行解释PandasMatplotlib 影评日期统计折线图数据概览这是一份豆瓣《流浪地球》电影短评数据共 9 列citys(城市)、content(评论内容)、evaluate(评价等级)、labs(标签)、nams(用户名)、scores(评分)、times(时间)、user_info(用户信息)、votes(点赞数)。关键统计基于可见 10 条城市分布北京 4 条、上海 1 条、重庆 1 条、空值 4 条。评价等级很差 ×4、较差 ×2、推荐 ×2、力荐 ×1、还行 ×1 →负面评价很差 较差占 60%正面推荐 力荐占 30%。评分scores单位 ×1010 (1 星)×4、20 (2 星)×2、30 (3 星)×1、40 (4 星)×2、50 (5 星)×1 →平均约 2.4 星整体口碑偏负面。点赞votes最高 69,686最低 12,540平均约 34,244。#1 导入绘图库matplotlib简写plt import matplotlib.pyplot as plt #2 导入数据分析库pandas简写pd import pandas as pd #3 导入数值计算库numpy简写np本段代码实际没用到np import numpy as np #4 读取csv影评文件编码gbk解决中文乱码 datapd.read_csv(rdatasource/CommentInfo.csv,encodinggbk) #5 设置matplotlib中文显示字体SimHei黑体 plt.rcParams[font.sans-serif] [SimHei] #6 解决负号显示方框问题 plt.rcParams[axes.unicode_minus]False #7 设置全局字体大小14号 plt.rcParams[font.size] 14 #8 times字段是【日期 时间】格式例如2026-02-05 14:30:00 # split( )按空格切分取第0部分只保留年月日 num_datedata[times].apply(lambda x:x.split( )[0]) #9 value_counts()统计每个日期出现多少次 当日评论数量 num_datenum_date.value_counts() #10 sort_index()按照**日期索引**升序排序按时间先后排 num_datenum_date.sort_index() #11 创建画布画布大小宽12英寸高4英寸 plt.figure(figsize(12,4)) #12 绘制折线图。x用0,1,2...序号y是每日评论数量 plt.plot(range(len(num_date)),num_date) #13 设置X轴刻度把序号替换为对应的日期rotation90 文字旋转90度防止重叠 plt.xticks(range(len(num_date)),num_date.index,rotation90) #14 设置图表标题 plt.title(评论数量随日期变化情况) #15 设置Y轴名称 plt.ylabel(评论数) #16 弹出展示图片 plt.show()整体功能读取影评 csv 文件从times评论时间提取年月日统计每一天有多少条影评画出折线图观察影评数量随时间的变化趋势。关键点说明第 8 行lambda x:x.split( )[0]时间字符串2026-02-05 20:10:00空格分割后第 0 段就是2026-02-05。第 910 行先计数再按日期排序。 不排序的话日期顺序会乱折线就没有时间先后意义。plt.xticks(...,rotation90)日期文字很长旋转 90 度避免文字挤在一起看不清。中文设置5、6 行不加这两行图上中文会显示成方框。二、Pandas apply () 方法结合你代码里这一行讲解num_datedata[times].apply(lambda x:x.split( )[0])1. 作用apply()对 Series一列数据里面的每一个元素执行同一个自定义函数。简单一句话遍历这一列的每一条数据挨个处理。2. 拆解你这句代码data[times]取 times 这一列里面数据类似2026-02-05 14:30:00日期 空格 时间.apply( 函数 )对这一列每一条字符串都执行括号里的函数lambda x: x.split( )[0]匿名函数x代表当前遍历到的单个单元格的值比如2026-02-05 14:30:00x.split( )用空格把字符串切分成列表[2026-02-05,14:30:00][0]取列表第 1 个元素也就是只保留年月日✅ 整行效果遍历 times 整列把每条 “日期 时间” 字符串提取出年月日生成新的一列。3. apply 三种使用场景Series.apply你现在这种单列按元素处理最常用# 示例给一列数字全部1 df[列名].apply(lambda x: x1)DataFrame.apply整张表按行 / 按列处理df.apply(func, axis0) # axis0 默认按列axis1 按一行一行处理DataFrame.applymap旧版本全表每个单元格单独处理新版本推荐 map区分apply适合复杂逻辑if 判断、多步字符串处理map简单一对一映射apply可以用自定义函数不止 lambda还能写 def 函数4. 不用 lambda用普通 def 函数改写等价代码方便理解# 定义函数输入一条时间字符串返回日期 def get_date(s): return s.split( )[0] # 调用apply每一行都会跑get_date num_date data[times].apply(get_date)效果和原来lambda版本完全一模一样。5. 教学重点适合高职大数据课✅ 优势一行代码批量处理整列不用写 for 循环遍历每一行⚠️ 缺点大数据量时apply运行速度不如 pandas 内置向量化函数适用场景字符串清洗、复杂条件转换就像你案例中提取日期6. 对比如果不使用 apply用原生 for 循环实现同样功能体会 apply 简化代码res [] for x in data[times]: day x.split( )[0] res.append(day) num_date resapply本质就是帮你封装了这个循环。三、pandas read_csv () 详解结合你代码里的语句datapd.read_csv(rdatasource/CommentInfo.csv,encodinggbk)1. 作用pd.read_csv()是 pandas 中读取 csv 文件加载为 DataFrame 二维表格的函数。 csv 就是逗号分隔的文本表格可以用 Excel 打开。2. 参数逐句拆解第一个参数文件路径rdatasource/CommentInfo.csvr原始字符串防止路径里\被当成转义字符Windows 路径必备datasource/CommentInfo.csv相对路径代表当前代码文件夹下的 datasource 文件夹里的评论文件encodinggbk 编码参数csv 中文常见两种编码gbk/utf-8不写 encoding中文大概率乱码出现方框、问号。Windows Excel 直接保存的 csv默认编码大多是gbk记事本另存为选 utf-8就写encodingutf-83. 基础语法模板import pandas as pd df pd.read_csv(文件路径, encoding编码)4. 常用拓展参数上课常用# 1. 指定哪一列作为行索引 pd.read_csv(xxx.csv, index_coltimes) # 2. 跳过前n行比如跳过说明文字 pd.read_csv(xxx.csv, skiprows2) # 3. 只读取指定几列节省内存 pd.read_csv(xxx.csv, usecols[times,content]) # 4. 自定义列名文件没有表头时用 pd.read_csv(xxx.csv,names[时间,评论])5. 返回值返回DataFramepandas 表格对象就是代码里的data变量。 之后可以用data[times]取出 times 这一列。6. 常见报错学生高频问题FileNotFoundError找不到文件原因路径写错csv 文件没有放在 datasource 文件夹文件名大小写不一致UnicodeDecodeError编码错误解决切换encodinggbk或encodingutf-87. 教学小结简答版read_csv 函数用于读取 CSV 格式的文本数据将文件加载为 Pandas 的 DataFrame 数据表支持设置文件编码、指定读取列、跳过行等参数方便后续数据清洗、统计分析。四、DataFramePandas 二维表格1. 一句话定义DataFrame 是 Pandas 的二维表格结构有行、有列像 Excel 里的一张工作表。二维 行 列每一列是一个Series一维序列行列都有标签行索引 (index)、列名 (columns)2. 结合你代码理解datapd.read_csv(rdatasource/CommentInfo.csv,encodinggbk)pd.read_csv读取 csv返回的结果就是 DataFrame赋值给变量 data。 data 这个表格列times评论时间、评论内容、用户名……行每一行代表一条影评记录表格index行索引times列content列02026-02-05 10:20:00电影很好看12026-02-05 14:30:00推荐观看✅data[times]取出 times 这一列取出的对象类型是Series一维3. DataFrame 核心特点二维结构多行、多列Series 只有一列DataFrame 可以同时包含多列不同类型数据字符串、数字都能放自带标签columns列名data.columns查看所有列index行索引默认 0,1,2,3…也可以自定义可以做数据筛选、清洗、统计你案例里提取日期、计数都基于它4. 基础操作课堂常用# 查看前5行 data.head() # 查看所有列名 data.columns # 查看表格形状 (行数,列数) data.shape # 选取单列 data[times] # 选取多行多列 data[[times,content]]5. 对比区分考试常考点Series一维只有一列DataFrame二维多行多列表格关系DataFrame 由多个 Series 组合而成6. 简答背诵版适合作业 / 考试DataFrame 是 Pandas 库中的二维带标签表格数据结构包含行索引和列名可以存储不同类型数据。可以由 read_csv 读取文件生成支持数据查询、清洗、统计分析。六、num_datenum_date.value_counts()逐行讲解1. 函数.value_counts()作用统计一列中每个不同值出现的次数。通俗讲分组计数看每个日期有多少条评论。2. 结合你的上下文# 上一步提取出纯年月日num_date此时是Series一维序列 num_datedata[times].apply(lambda x:x.split( )[0]) # 当前这句 num_datenum_date.value_counts()执行前num_date是全部日期的列表重复很多2026-02-05 2026-02-05 2026-02-04 2026-02-05执行.value_counts()之后索引日期值该日期评论数量默认按数量从大到小排序表格index日期值评论数量2026-02-051282026-02-04962026-02-0342⚠️重点默认结果按数量降序排列不是按时间先后 所以后面必须写sort_index()把它改成按日期时间排序才能画正确的时间折线图。num_datenum_date.sort_index() # 按索引日期升序3. 基础语法Series.value_counts(normalizeFalse, sortTrue)常用参数normalizeTrue不返回数量返回占比频率sortFalse不自动排序4. 考点简答版作业背诵value_counts()是 Series 对象方法用于统计序列中每个唯一元素的出现频次返回新的 Series索引为原始数据值为出现次数默认按频次降序排列。5. 类比类似 Excel 的数据透视表 / 计数或者 SQL 的groupby 日期 count(*)