如何通过Python分析中国演员排名?他第一你认可吗?

电影演员合作关系可视化(二)数据分析与可视化 在上一篇《电影演员合作关系可视化(一)整体思路与爬虫编写》的基础上,对数据进行分析以及可视化。 阅读详情

项目背景

 

上个月笔者的一个同学开了间影视投资公司,出于对创业人员的仰慕和影视投资行业的好奇,我就跟他寒暄了几句,聊天当中他提及到国庆节有部《攀登者》即将上映,预计票房会大好,因为吴京是这部片的主演。然后我就想,目前吴京在国内演员中位列几何呢?正好之前爬了猫眼电影数据,基于python数据分析的方式,分析中国演员排名情况。

数据导入

 

导入之前爬取到的猫眼数据,由于爬取过程不是本文的主要内容,所以简单描述下数据情况:20110101至20191019年在中国上映,并且有用户评分和票房的影片,总共是2923部。

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
# 加载数据
def load_data():
    # 加载电影票房
    open_filepath = 'D:\pythondata\\3、猫眼电影\\box_result.csv'
    movie_box = pd.read_csv(open_filepath)
    movie_box = movie_box[['电影id', '电影名称','首映日期','总票房']].drop_duplicates()
    # 加载电影信息
    open_filepath = 'D:\pythondata\\3、猫眼电影\\maoyan_movie.xlsx'
    movie_message = pd.read_excel(open_filepath,sheet_name='maoyan_movie')
    movie_message.columns = ['电影url','电影名称','电影题材','国家','上映时间','用户评分','电影简介','导演/演员/编剧']
    movie_message = movie_message[['电影url','电影题材','国家','用户评分','导演/演员/编剧']].copy()
    movie_message.drop_duplicates(inplace=True)
    movie_message['电影id'] = movie_message.apply(lambda x:x['电影url'].replace('https://maoyan.com/films/',''),axis=1)
    movie_message[['电影id']] = movie_message[['电影id']].apply(pd.to_numeric)
    # 合并电影信息和票房
    data = pd.merge(movie_box,movie_message,how='inner',on=['电影id'])
    return data

数据处理

 

由于此次只分析中国演员,所以需要剔除国外影片,并将每部影片的演员列表从字段“导演/演员/编剧”中分割出来。

# 只筛选中国的电影
data = data[data['国家'].str.contains('中国')]
# 剔除空值
data = data.dropna(subset=["导演/演员/编剧"])
# 将演员列表从字段“导演/演员/编剧”中分割出来
data['演员'] = data.apply(lambda x:x['导演/演员/编剧'] if '演员' in x['导演/演员/编剧'] else None,axis=1)
data['演员list'] = data.apply(lambda x:  ','.join(x['演员'].split('yyyyy')[1].split('xxxxx')[2:]) if pd.notnull(x['演员']) else None,axis=1)
# 剔除无演员列表的行
data = data.dropna(subset=["演员list"])
# 剔除无用字段
data.drop(['导演/演员/编剧'],axis=1,inplace=True)
data.drop(['演员'],axis=1,inplace=True)

因为考虑到配音类型的影片是看不到演员本人的,所以需要剔除配音类型影片。再将演员列表从行转置列,使得每行电影名称和演员是一一对应的。由于猫眼电影已经按照演员的出场频率进行排序,所以每部影片取前四名演员,作为影片主演,其中多明星合拍的影片,如《我和我的祖国》就改为取前十名。

# 拆分演员列表,并转置成一列
data = data.drop("演员list", axis=1).join(data["演员list"].str.split(",", expand=True).stack().reset_index(level=1, drop=True).rename("演员"))
# 剔除配音演员
data = data[~data['演员'].str.contains('配音')]
data['演员'] = data.apply(lambda x: x['演员'].split('饰:')[0] if '饰:' in x['演员'] else x['演员'], axis=1)
# 剔除分割演员名称错误的行
data = data[~data['演员'].str.contains('uncredited')]
data = data[~data['演员'].str.contains('voice')]
data = data[~data['演员'].str.contains('Protester')]
# 取每部电影的前四名演员,部分影片特殊
data_actor = data[['电影id','电影名称','演员']].drop_duplicates()
data_actor_top4 = data_actor[data_actor['电影名称']!='我和我的祖国'].groupby(['电影id','电影名称']).head(4)
data_actor_top10 = data_actor[data_actor['电影名称']=='我和我的祖国'].groupby(['电影id','电影名称']).head(10)
data_actor_top4 = pd.concat([data_actor_top4,data_actor_top10])
# 剔除外国演员
data_actor_top4['演员名字长度'] = data_actor_top4.apply(lambda x: len(x['演员']),axis=1)
data_actor_top4 = data_actor_top4[(data_actor_top4['演员名字长度']<=3)].copy()
data_actor_top4.drop("演员名字长度",axis = 1,inplace=True)
# 匹配
data = pd.merge(data,data_actor_top4,how='inner',on=['电影id','电影名称','演员'])

然后,拆分每部电影的电影题材类型并进行转置,再汇总每个演员出演过的电影题材,排序后取前三个类型,作为演员的拿手题材。

# 拆分电影题材
data = data.join(data["电影题材"].str.split(",",expand = True).stack().reset_index(level = 1,drop = True).rename("题材"))
# 取每位演员最擅长的电影题材TOP3
data_type_actor = data[['电影id','电影名称','演员','题材']].drop_duplicates().groupby(['演员', '题材']).agg({'电影id': 'count'}).reset_index().sort_values(['演员','电影id'],ascending=False)
data_type_actor = data_type_actor.groupby(['演员']).head(3)
data_type_actor = data_type_actor.groupby(['演员'])['题材'].apply(list).reset_index()
data_type_actor['题材'] = data_type_actor['题材'].apply(lambda x: ','.join(str(i) for i in list(set(x)) if str(i) != 'nan'))
data_type_actor.rename(columns={'题材': '演员_拿手题材'}, inplace=True)
data = pd.merge(data,data_type_actor,how='left',on=['演员'])

数据分析

 

目前只有“演员总票房”和“影片平均评分”两个字段,可用作描述一个演员综合能力,所以需要衍生一些字段:

电影数量:统计演员主演过的影片数量;

大于10亿票房影片数量:汇总单部影片票房大于10亿的数量;

大于10亿票房影片计分:按照不同票房区间赋予分值,再汇总;

由于部分演员只出演过一部影片,属于单样本,若不剔除,会影响各项指标的数值分布。

actor = result[['演员','总票房','用户评分']].drop_duplicates()
# 衍生字段:平均票房、大于10亿票房影片、大于10亿票房影片计分
actor['用户评分'] = actor.apply(lambda x:0 if x['用户评分']=='暂无评分' else x['用户评分'],axis=1)
actor['大于10亿票房影片数量'] = actor.apply(lambda x:1 if x['总票房']>100000 else 0,axis=1)
# 按照票房赋予分值
def goal(x):
    if x['总票房']<=100000:
        division_goal = 0
    elif x['总票房']<=200000:
        division_goal = 1
    elif x['总票房'] <= 300000:
        division_goal = 2
    elif x['总票房'] <= 400000:
        division_goal = 3
    elif x['总票房'] <= 500000:
        division_goal = 4
    else:
        division_goal = 5
    return division_goal
actor['大于10亿票房影片计分'] = actor.apply(goal,axis=1)
actor['电影数量'] = 1
actor['用户评分'] = pd.to_numeric(actor['用户评分'])
actor['大于10亿票房影片数量'] = pd.to_numeric(actor['大于10亿票房影片数量'])
actor['大于10亿票房影片计分'] = pd.to_numeric(actor['大于10亿票房影片计分'])
# 汇总
actor2 = actor.groupby(['演员']).agg({'总票房': 'sum',
                                    '大于10亿票房影片数量': 'sum',
                                    '大于10亿票房影片计分': 'sum',
                                    '电影数量': 'count',
                                    '用户评分':'mean',}).reset_index()
# 筛选影片数量大于1的行——只有一部影片的演员设为单样本,会影响标准化的结果
actor2 = actor2[actor2['电影数量']>1].reset_index(drop=True)

最后,由于数值字段之间的量纲不同,需要进行标准化处理后才可以进行比较。“演员总票房”的高低是衡量一个演员能力的重要因素,这里笔者将“大于10亿票房影片数量”和“大于10亿票房影片计分”也作为两点重要因素,而“影片平均评分”和“电影数量”作为次要因素,最终标准化处理后的计算公式:

总分=演员总票房+大于10亿票房影片数量+大于10亿票房影片计分+0.5*影片平均评分+0.5*电影数量

这里笔者曾用K-means聚类算法将演员划分为四个集群,通过查看集群的分布情况后发现,划分结果与上述公式计算后的总分排名情况十分相似(比如,总分1-20名划分成集群1,21-50名划分成集群2),所以取消了用聚类算法的方式划分演员档次。

# 复制一份副本
actor_copy = actor2.copy()
# 标准化处理
scaler = StandardScaler()
numeric_features = actor2.dtypes[actor2.dtypes != 'object'].index
scaler.fit(actor2[numeric_features])
scaled = scaler.transform(actor2[numeric_features])
for i, col in enumerate(numeric_features):
    actor2[col] = scaled[:, i]
# 划分演员档次:权重求和,根据分值排序
result = actor2.apply(lambda x: x['总票房']+x['大于10亿票房影片数量']+x['大于10亿票房影片计分']+0.5*x['电影数量']+0.5*x['用户评分'],axis=1)
# # 划分演员档次——方法2:采用聚类算法,自动分成4个组
# actor_model = actor2[['总票房', '大于10亿票房影片数量', '大于10亿票房影片计分','电影数量','用户评分']].values
# y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(actor_model)
# result2 = pd.Series(y_pred)
# 合并两种结果
model_actor_reuslt = pd.concat([actor_copy, result], axis=1)
model_actor_reuslt.rename(columns={0: '总分'},inplace=True)
model_actor_reuslt = model_actor_reuslt.sort_values('总分',ascending=False).reset_index(drop=True)

数据描述

 

由于工作上经常使用BI工具tableau进行图表制作,因此下列的图表均用tableau绘制。其实pyecharts生成的图表也十分美观,为了方便这里就不用这个库画图了,有兴趣的小伙伴也可以了解下这个库。

先从整体上对电影的概况进行描述分析,才能更好地理解演员各项指标高低的优劣程度。首先,2011年至今,国内上映的影片总共是2129部,其中10亿票房以上的影片只有39部,占了总体的0.02%。

图1-1 电影总数

目前国内影片最高票房已经到50-60亿之间,只有一部。40-50亿只有两部,大部分10亿以上的票房都集中在10-20亿之间。

图1-2 电影票房区间

整体上,剧情、喜剧和爱情类型的电影题材拍得最多,而灾难类型的电影最少。从热门和冷门的电影题材中,很好地诠释了“报喜不报忧”这句成语,毕竟每个走进电影院的人都希望能轻松愉快地度过这两个小时。所以10亿以上票房的影片中,喜剧类型的电影题材反而排在了第一位。

图1-3 电影题材

从电影上映时间轴中可以看出,整体上,17年之前上映的影片逐年增加,但在17年之后有所下降。而10亿以上票房的影片每年都在增加,侧面说明近几年国内电影影片质量有所上升。

图1-4 电影上映时间轴

最后,将全部图表放到同一个仪表板中,可以很方便地看到10亿以上票房的影片分布情况,以及具体的影片名称。其中,2012年的《人在囧途之泰囧》是国内第一部10亿+票房影片,2015年的《捉妖记》是首部20亿+票房影片,2016年的《美人鱼》是首部30亿+票影片,2017年的《战狼2》是首部50亿+票房影片,而2019年的《流浪地球》和《哪吒之魔童降世》是唯一两部40亿+票房影片。从这个时间轴可以看出,自2015年起,每年最高票房都比前年多出10亿以上。

图1-5 电影概况

根据上述的计算公式得到总分TOP10的名单,前三名分别是黄渤、吴京和沈腾。这也难怪笔者的同学会对吴京出演的影片信心那么高。

图2-1 演员总分排名

汇总每个演员主演的电影票房后,得到总票房TOP10的名单,目前国内百亿票房均是男演员,分别是吴京、黄渤、杜江和沈腾。其中吴京已经是150亿票房冠军,而让笔者比较意想不到的是杜江也上了百亿榜,虽然他参演的几部热门影片,如《红海行动》、《我和我的祖国》和《中国机长》都不是第一主演,但这几部都是10亿+票房影片,是不是能说明他存在某些旺票房特质呢?

图2-2 演员总票房

再来看看演员电影数量TOP10的分布情况,可以看到前几名都是香港演员,其中古天乐在7年内主演了36部影片,位列榜首。除了影片数量位列榜首外,其实平平无奇的古仔已经默默地捐赠了100多所学校,这也许就是他当上电影“劳模”的原因吧。

图2-3 演员电影数量

最后,将上述三张图表和详细列表放到同个仪表板中,就可以清楚地知道,能够位列前茅的演员都是主演过多部影片,并且拥有多部10亿+票房影片。其中有一个比较有趣的地方是王宝强的影片平均评分是6.3,但他仍然能够排到第七名,原因是他主演过几部评分在5分以下的影片,才导致他平均评分会这么低。

图2-4 演员概况

结语

 

本文旨在让大家了解一下国内电影的整体概况和演员概况,所以只是简单地对数据进行描述性分析,并没有运用到机器学习这方面的知识。一般地,描述性分析是做数据分析必不可少的一步,通过简单的几个图表就能直观地对数据有整体上的认知。最后也要谢谢同事Yan姐的一些指导。

你觉得可以吗?

完整项目代码获取点这即可

 

电影分析案例-分析导演、演员拍电影盈利和票房(2021/07/25) 次案例主要是对数据计算的应用。 如题,数据还是move数据,计算利润 profit 是用 gross 减去 budget。 导入数据,计算profit df = pd.read_csv('movie_metadata.csv', usecols=[0,1,2,3,4,5,6,7,8,9,10,11,13,15,27]) data=df.dropna(how='any') data #%% data['profit']=data['gross'] - data['bu 阅读详情

相关推荐

人物关系可视化图谱

利用python对电影《釜山行》剧本分词处理,识别人物实体及人物关系,再用图数据软件genphi建立电影人物关系的知识图谱。文件中包含电影剧本、python处理的脚本文件、抽取出的电影人物及关系csv文件。

中国编程第一人,一人抵一城!

有这样一位年轻人。他获得过百度之星程序设计大赛冠军、谷歌编程挑战赛第三名。他在“程序设计奥林匹克”之称的国际大学生程序设计竞赛(ACM/ICPC)获得中国赛区冠军、全球总决赛第二名。他在...

程序员小灰的博客 1万+

Python比较两个图片相似度的方法

主要介绍了Python比较两个图片相似度的方法,涉及Python操作pil模块实现图片比较的技巧,具有一定参考借鉴价值,需要的朋友可以参考下

Python 这把火已经烧透了,登上“最强王者”中国程序猿是“全场MVP

Python由于其语言的特性——“活好话少”,受到许多开发者的偏爱。而一组百度和谷歌搜索数据显示,中国程序猿对Python的爱,堪称 「地表最强」 !

DEVELOPERAA的博客 483

51单片机-点亮LED和蜂鸣器

ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。ULN2003是大电流驱动陈列,多用于单片机、只能仪表、PLC、数字量输出卡等控制电路中。可直接驱动蜂鸣器、继电器等负载。void delay(u16 i) // i等于1大约10uswhile(i--);//取反,高低电平不断变化,产生脉冲delay(10);// 周期200us。

三日沐水 1130

CAS5和CAS6自定义异常提示消息

CAS自定义异常提示消息

weixin_42949219的博客 980

如何通过 Python 分析中国演员排名?

作者 | AJ-Gordon 责编 | 刘静 出品 | 优快云(ID:优快云news) 项目背景 上个月笔者的一个同学开了间影视投资公司,出于对创业人员的仰慕和影视投资行业的好奇,我就跟他寒暄了几句,聊天当中他提及到国庆节有部《攀登者》即将上映,预计票房会大好,因为吴京是这部片的主演。然后我就想,目前吴京在国内演员中位列几何呢?正好之前爬了猫眼电影数据,...

优快云资讯 9808

保姆级教程:用MS建完分子模型,如何一键转成LAMMPS能用的data文件?

本文详细介绍了如何将Materials Studio(MS)构建的分子模型转换为LAMMPS可用的data文件的全流程。重点讲解了力场选择、环境配置、转换命令参数解析及常见问题排查,帮助初学者快速掌握MS与LAMMPS之间的数据转换技巧,特别适合计算材料学领域的研究人员。

weixin_42665255的博客 472

python排名分析_如何通过 Python 分析中国演员排名?

作者 | AJ-Gordon责编 | 刘静项目背景上个月笔者的一个同学开了间影视投资公司,出于对创业人员的仰慕和影视投资行业的好奇,我就跟他寒暄了几句,聊天当中他提及到国庆节有部《攀登者》即将上映,预计票房会大好,因为吴京是这部片的主演。然后我就想,目前吴京在国内演员中位列几何呢?正好之前爬了猫眼电影数据,基于python数据分析的方式,分析中国演员排名情况。数据导入导入之前爬取到的猫眼数据,由于...

weixin_39600837的博客 255

DeerFlow 系列教程 第十二篇 | Tools 工具体系——从内置工具到 MCP 扩展

文件此工具允许 Agent 在运行时创建新的自定义 Agent。@toolsoul: str, # SOUL.md 的完整内容description: str, # Agent 的一行描述创建流程从获取agent_name写入配置文件(包含 name 和 description)写入灵魂文件SOUL.md(定义 Agent 的人格和行为)更新中的错误回滚MCP(Model Context Protocol)是一种标准协议,允许 AI Agent 连接外部工具服务器。DeerFlow 通过。

weixin_43674738的博客 181

华为OD机试真题 新系统 9月20号 【字符串分组求和】

华为OD新系统机试真题【字符串分组求和】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【字符串分组求和】解析。

qq_45776114的博客 632

程序员用 Python 分析中国演员排名,票房最高的是意料之中的他

@项目背景 一个同学开了间影视投资公司,出于对创业人员的仰慕和影视投资行业的好奇,我就跟他寒暄了几句,聊天当中他提及到国庆节有部《攀登者》即将上映,预计票房会大好,因为吴京是这部片的主演。然后我就想,目前吴京在国内演员中位列几何呢?正好之前爬了猫眼电影数据,基于Python数据分析的方式,分析中国演员排名情况。 数据导入 导入之前爬取到的猫眼数据,由于爬取过程不是本文的主要内容,所以简单描述下数据...

python核心编程 1551

2026国内Claude Code保姆级教程:安装、避坑、防串台全优化

安装 Claude Code CLI + 切换 npm 国内镜像优先配置固定关闭:自动联网、自动项目扫描VSCode 内置终端直接用,不装多余插件会话隔离+指令约束,彻底解决 Rust、小程序 跨语言串台。

lpfasd123的博客 2569

如何通过 Python 分析中国演员现阶段排名

上个月某一天跟朋友聊天,聊到国庆电影,提到《攀登者》上映,预计票房会大好,因为吴京是这部片的主演。然后我就想,目前吴京在国内演员中位列几何呢?正好之前爬了猫眼电影数据,基于python数据分析的方式,分析中国演员排名情况。 数据导入 导入之前爬取到的猫眼数据,由于爬取过程不是本文的主要内容,所以简单描述下数据情况:20110101至20191019年在中国上映,并且有用户评分和票房的影片,总共是2...

chen801090的博客 658

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

如何通过 Python 分析中国演员排名?第一名居然是她?

项目背景 上个月笔者的一个同学开了间影视投资公司,出于对创业人员的仰慕和影视投资行业的好奇,我就跟他寒暄了几句,聊天当中他提及到国庆节有部《攀登者》即将上映,预计票房会大好,因为吴京是这部片的主演。然后我就想,目前吴京在国内演员中位列几何呢?正好之前爬了猫眼电影数据,基于python数据分析的方式,分析中国演员排名情况。 数据导入 导入之前爬取到的猫眼数据,由于爬取过程不是本文的主要内容...

406

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

程序员用 Python 分析中国演员排名,票房最高的果然是 TA!

作者 | AJ-Gordon责编 | 刘静出品 | 优快云(ID:优快云news)项目背景上个月笔者的一个同学开了间影视投资公司,出于对创业人员的仰慕和影视投资行业的...

程序人生的博客 1254

谁才是天朝最厉害的演员?让Python来为你揭晓!

一、项目背景 上个月笔者的一个同学开了间影视投资公司,出于对创业人员的仰慕和影视投资行业的好奇,我就跟他寒暄了几句,聊天当中他提及到国庆节有部《攀登者》即将上映,预计票房会大好,因为吴京是这部片的主演。然后我就想,目前吴京在国内演员中位列几何呢?正好之前爬了猫眼电影数据,基于python数据分析的方式,分析中国演员排名情况。 二、数据导入 导入之前爬取到的猫眼数据,由于爬取过程不是本文的主要...

轻松学python的博客 321

【Python】Python网络爬虫-电视剧《平凡的荣耀》数据爬取与分析

一、前言 距上次更新博客,又过去很长时间了,感觉再不更新一下,自己写博客的习惯就要废了,哈哈。从去年九月份开学之后,疫情学期期末考试开学考、实验室项目软著申请和新项目设计、课程集训等事情较多,没有很多时间;然后这个学期我到大三下学期,实验室工作交接完就准备考研,之后也没有很多时间来写博客,所以赶紧来更新一下,和大家分享一些知识和心得,希望喜欢的小伙伴可以点赞、收藏和关注,哈哈。 二、《平凡的荣耀》数据爬取与分析 1 简介 旨在实现对翻拍电视剧《平凡的荣耀》综合热度的分析,计划设计数据爬取模块、数据分析模块

Up_Long的博客 6900

来看看谁是最牛逼的导演和演员

本文基于豆瓣评分数据,通过自定义评分规则(9.2分以上45分,9.0-9.2分30分等)对导演和演员进行排名。结果显示宫崎骏以253分位列导演榜首,汤姆·汉克斯以289分成为最佳演员。评分方法考虑了主演番位权重(一号100%,二号80%等)。数据来源于豆瓣评分人数超5万且评分7分以上的电影,通过爬虫获取。值得注意的是,查理·卓别林因入选电影较少排名靠后,反映了该方法的局限性。完整SQL查询和Java爬虫代码见附录。

程序员小董的专栏 336
上一篇: 用Python字符串的方式看黑人抬棺,我的快乐就这么简单!
下一篇: Python杀死Excel!确实方便便捷!
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值