利用pandas对MovieLens电影数据分析

article/2025/10/12 17:17:49

掌握pandas基本语法操作「pandas基础入门中有详细语法格式」后,就可以利用pandas做一些简单实例的数据处理。

Movie电影数据分析

首先需要下载电影数据集MovieLens,这个数据集中包含用户数据;电影数据;电影评分表。电影数据中包含了电影id,电影名,电影类型。这个数据集中的数据都经过了预处理,保证一个用户至少对20个电影进行了评分。

导入数据

首先,通过pandas将电影数据导入程序中。
要想读用户信息,需要把用户表数据的标题先表示出来;读列表的第一个参数是文件名,因为没有表头,因此需要设置header为空。

unames = ['user_id','gender','age','occupation','zip']
users = pd.read_table('ml-1m/users.dat',sep = '::',header = None,names = unames)

同理将电影数据和电影评分数据也导入到程序;

rating_names = ['users_id','movie_id','rating','timestamp']
ratings = pd.read_table('ml-1m/users.dat',sep = '::',header = None,names = rating_names)movie_names = ['movie_id','title','genres']
movies = pd.read_table('ml-1m/users.dat',sep = '::',header = None,names = movie_names)

通过print (len( ))可以返回导入数据的总数量,可以设置显示数据条数;

数据合并

pandas中,需要吧数据合并起来更利于分析,用merge函数先合并用户表和评分表,再合并电影表;

data = pd.merge(pd.merge(users,ratings),movies)

使用merge函数需要注意被合并表格需要有相同行/列名;当不指定合并行时,默认按照相同行/列名进行合并。
在这里插入图片描述
当没有相同的可以用于合并的行/列名时,运行报错:No common columns to perform merge on
merge函数会将两个表中的电影id一一对应进行匹配,通过data[data.users_id == 1可以查看用户id为1的用户看的所有电影的评分;
在这里插入图片描述
用到的是pandas中数据透视的函数;查询值是评分,行索引是电影名,列索引是性别,通过平均值来聚合数据
计算每一部电影,不同性别的评分对比

ratings_by_gender = data.pivot_table(values = 'rating',\
index = 'title',columns = 'gender',aggfunc = 'mean')
ratings_by_gender.head(10)# check the top 10 movies of men and women

其中,pandas.pivot_table是pandas中数据透视表函数。
语法格式如下:

DataFrame.pivot_table(values=None, index=None, columns=None, \aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False)

其中参数:

  • values 列:可选;
  • index索引:如果传递数组,则其长度必须与数据长度相同。该列表可以包含任何其他类型(列表除外)。在数据透视表索引上进行分组的键。如果传递数组,则其使用方式与列值相同;
  • columns行:如果传递数组,则其长度必须与数据长度相同。该列表可以包含任何其他类型(列表除外)。在数据透视表索引上进行分组的键。如果传递数组,则其使用方式与列值相同;
  • aggfunc函数,函数列表,字典,默认为numpy.mean:如果传递了函数列表,则生成的数据透视表将具有层次结构列,其顶层是函数名称(从函数对象本身推断出)。如果传递了dict,则键为要聚合的列,值是函数或函数列表;
  • fill_value标量,默认无:用于替换缺失的值(在汇总后的结果数据透视表中);
  • margins,类型为bool,默认为False:添加所有行/列;
  • dropna,类型为bool,默认为True:不要包括所有条目均为NaN的列;
  • margins_name str,默认为“All”:当margins为True时将包含总计的行/列的名称。

在上述代码中,查询值是评分,行索引是电影名,列索引是性别,通过平均值来聚合数据

由此我们可以去分析哪些电影的男女观影分歧最大。要想算出分歧最大,就要算平均得分差异越大的数据,就需要加一列数据,用于存放男女评分数据差异值。

ratings_by_gender['diff'] = ratings_by_gender.F-ratings_by_gender.M
ratings_by_gender.head(10)# show 10 movies with big differences in ratings 

diff:计算差异与所述数据帧另一元件相比,数据帧元件的erence(默认为前一行中元素)。
通过对diff进行排序,找出最大值,就可以找出分歧最大的电影,ascending是排序方式,默认升序。

ratings_by_gender.sort_values(by = 'diff',ascending = True).head(10)

在这里插入图片描述

数据分组

通过分析电影评分数据,看看那些电影看的人最多。给电影评分的人最多,说明看的人最多,就可以找出热门电影;

ratings_by_title = data.groupby('title').size()

按照电影名title来进行数据分组,通过size分别获取每个title下评分个数;按照title来进行分组;接着按照评分数量给数据进行排序(降序)找出最热门的10部电影.

ratings_by_title.sort_values(ascending = False).head(10)

在这里插入图片描述
从另一排序维度来看,我们可以通过数据透视表查看评分最高的电影。这里聚合函数还是选取求平均值;通过value=获取评分的数据,利用电影标题进行索引。

mean_ratings = data.pivot_table(values = 'rating',index = 'title',aggfunc = 'mean')

在这里插入图片描述
对上述平均评分数据进行排序,就可以得出评分最高的10部电影

mean_ratings.sort_values(by = 'rating',ascending = False).head(10)

在这里插入图片描述
通过评分最高的方式选出高分电影后,发现有些电影是很小众和陌生的,可以却是评分很高的电影,原因是看的人很少但看完后给了高分。因此,评价一部电影是否为好电影,不仅仅看评分还需要有足够大的观看人数。所以,我们可以说一部好电影,既要是热门电影,又要是评分很高的电影。
查看观看人数最多的top10电影的评分:

top_10_hot = ratings_by_title.sort_values(ascending = False).head(10)
mean_ratings.loc[top_10_hot.index]

在这里插入图片描述
同理查看评分最高top10电影的观看人数:

top_10_score = mean_ratings.sort_values(by = 'rating',ascending = False).head(10)
ratings_by_title.loc[top_10_score.index]

在这里插入图片描述
可见两个数据毫无重合,因此首先需要找出热度足够高的电影,即评分次数较多的电影。假设大于2000评分就代表热度足够高;接着需要从热度足够高的电影中排序查找评分足够搞得电影,即针对热门电影的评分数据进行降序排序处理,取top10即是真正的好电影了。

hot_movies = ratings_by_title[ratings_by_title > 2000]
print(len(hot_movies))
hot_movies.head(10)
hot_movies_rating = mean_ratings.loc[hot_movies.index]
top_10_good_movies = hot_movies_rating.sort_values(by = 'rating',ascending = False).head(10)
top_10_good_movies

在这里插入图片描述


http://chatgpt.dhexx.cn/article/LLfN6Ll9.shtml

相关文章

MovieLens数据集处理

有一个定律,对于内容的访问遵循80/20原则,也就是20%的内容,会占有80%的访问量。就是zipf分布[1]。  根据MovieLens的数据集中的ratings.dat,我做了数据处理,获取得分最高的2000个条目。 ml-pro.py import os import …

推荐系统笔记(二):常用数据集Movielens学习

介绍 movielens数据集是电影推荐数据集,数据集有多种大小和目的使用的数据集。按照使用目的可以分为两类,一类数据集适用于推进最新研究的数据,一类数据集是用于高校研究和教育科研使用的数据集。本次介绍三个数据集的使用和处理。 数据集下…

java读取movielens数据txt

各位好,我是菜鸟小明哥,movielens数据是常见的推荐方面的开源数据集,另一个推荐方面的数据集是新闻MIND,本文将从movielens再次出发,做基础的推荐方法,比如基本的基于标题的相似性,word2vector&…

推荐系统数据集之MovieLens

1.概述 MovieLens其实是一个推荐系统和虚拟社区网站,它由美国 Minnesota 大学计算机科学与工程学院的GroupLens项目组创办,是一个非商业性质的、以研究为目的的实验性站点。GroupLens研究组根据MovieLens网站提供的数据制作了MovieLens数据集合&#xff…

【工具】Movielens数据集详细介绍

MovieLens数据集 MovieLens数据集包含多个用户对多部电影的评级数据,也包括电影元数据信息和用户属性信息。 下载地址 http://files.grouplens.org/datasets/movielens/ 介绍 下面以ml-100k数据集为例进行介绍: 最主要用的是u.data(评分) | u.item…

movielens数据集简述

一、movielens数据集 ratings数据: 文件里面的内容包含了每一个用户对于每一部电影的评分。数据格式如下: userId, movieId, rating, timestamp userId: 每个用户的id movieId: 每部电影的id rating: 用户评分,是5星制,按半颗星的规模递增(0.5 stars - 5 stars) timestam…

Movielens数据集详细介绍

MovieLens数据集包含多个用户对多部电影的评级数据,也包括电影元数据信息和用户属性信息。下载地址为:http://files.grouplens.org/datasets/movielens/ 下面以ml-100k数据集为例进行介绍: 最主要用的是u.data(评分) | u.item(电影信息) …

movielens数据集介绍及使用python简单处理

0 前言 个性化推荐中,电影推荐研究时常使用movielens上的数据集。该网站的数据集主要分两部分, 一是用于推进最新研究进展的数据集。当前最新的是发布于2019年12月份的25M数据集。 二是用于高校、组织科研的数据集。该类数据集按其是否带有标签、时间…

mui用ajax上拉加载更多,mui上拉加载更多下拉刷新数据的封装过程

辗转用mui做了两个项目,空下来把mui上拉加载更多,下拉刷新数据做了一个简单的封装,希望可以帮助到需要的朋友 demo项目的结构 直接贴代码了 index.html mui上拉刷新下拉加载都这里了,两个方法搞定mui上拉刷新下拉加载demo--封装 l…

如何实现上拉加载和下拉刷新

下拉刷新和上拉加载这两种交互⽅式通常出现在移动端中 本质上等同于PC⽹⻚中的分⻚,只是交互形式不同 开源社区也有很多优秀的解决⽅案,如 iscroll 、 better-scroll 、 pulltorefresh.js 库等等 这些第三⽅库使⽤起来⾮常便捷 我们通过原⽣的⽅式实现…

ComposeUI——下拉刷新+上拉加载(一、简单封装)

前言:ComposeUI是将来开发的趋势,本人也在对它进行学习,会把踩过的坑一一记录下来,希望能对大家有帮助。话不多说,直接开干。 目录 下拉刷新 1、引入依赖库 2、使用方法 上拉加载 1、先看用法(结合下…

Flutter 下拉刷新、上拉加载

Flutter 下拉刷新、上拉加载有很多第三方插件,本文使用插件为:pull_to_refresh 目前pull_to_refresh在pub.dev上的使用情况: 刷新header的类型: ClassicHeader const ClassicHeader({Key? key,RefreshStyle refreshStyle: RefreshStyle.…

BaseQuickAdapter上拉加载功能实现

最近使用BaseQuickAdapter进行RecyclerView 的Adapter的数据绑定显示。 实现上拉加载与下拉刷新功能,遇到如下问题: 1、首先是实现下拉刷新、下拉加载的监听(xml布局就不贴出来了): 2、现在贴出来错误的处理方式&…

android 官方上拉,手把手教你实现RecyclerView的下拉刷新和上拉加载更多

纵观多数App,下拉刷新和上拉加载更多是很常见的功能,但是谷歌官方只有一个SwipeRefreshLayout用来下拉刷新,上拉加载更多还要自己做。 基于RecyclerView简单封装了这两个操作,下拉刷新支持LinearLayoutManager、GridLayoutManager…

uniapp下拉刷新上拉加载

一、需求 留言板主页&#xff0c;显示所有的留言信息&#xff0c;带有分页功能&#xff1b;上拉加载数据&#xff0c;下拉刷新数据二、代码 1、pages.json 2、messageBoard.vue 用了 uniapp 提供的组件&#xff1a; uni-load-more.vue <uni-load-more :status"load…

jquery 实现上拉加载功能

emmmm&#xff0c;看到了以前自己的写的代码&#xff0c;用jquery实现的上拉加载&#xff0c;顺便修复了以前漏下的bug&#xff0c;感觉可以记录一波。 好的先上图&#xff0c; 好的首先关注console控制台&#xff0c;再来就是右图的内容&#xff0c;页面上初始仅有两个div 接…

微信小程序下拉刷新、上拉加载

微信小程序官方没有给出具体的下拉刷新和上拉加载组件&#xff0c;我们可以基于小程序原生组件scroll-view的扩展与封装,实现简单的上拉加载、下拉刷新组件。 1. 封装组件 // components/customPullDown/index.js Component({options: {multipleSlots: true},properties: {ch…

uniapp局部上拉加载数据

一、页面局部实现上拉加载数据 只有评论区可以上拉加载数据&#xff0c;网上找到了 vue-infinite-scroll二、使用 官方示例 1、 npm 加载依赖 npm install vue-infinite-scroll --save2、 单个页面引用 import infiniteScroll from vue-infinite-scrollexport default {dire…

【Compose】亲手封装一个简单灵活的下拉刷新上拉加载 Compose Layout

Compose 的下拉刷新有现成的 Material 库可以直接使用&#xff0c;非常简单方便。 但是上拉加载目前没看到有封装的特别好的库&#xff0c;Paging 有些场景无法满足&#xff0c;而且上拉加载也是个比较简单的功能&#xff0c;没必要再去依赖一个质量未知的库。我们可以基于目前…

如何实现上拉加载,下拉刷新?

如何实现上拉加载下拉刷新&#xff1f; 实现原理上拉加载下拉刷新 实现原理 上拉加载及下拉刷新都依赖于用户交互 最重要的是要理解在什么场景&#xff0c;什么时机下触发交互动作 上拉加载 首先可以看一张图 上拉加载的本质是页面触底&#xff0c;或者快要触底时的动作 判…