一、项目背景
上个月笔者的一个同学开了间影视投资公司,出于对创业人员的仰慕和影视投资行业的好奇,我就跟他寒暄了几句,聊天当中他提及到国庆节有部《攀登者》即将上映,预计票房会大好,因为吴京是这部片的主演。然后我就想,目前吴京在国内演员中位列几何呢?正好之前爬了猫眼电影数据,基于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['演员名字长度']100000 else 0,axis=1)
# 按照票房赋予分值
def goal(x):
if x['总票房']
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?