您当前的位置: 首页 >  Python

轻松学Python

暂无认证

  • 1浏览

    0关注

    317博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

轻松学Python 发布时间:2019-12-31 15:29:33 ,浏览量:1

一、项目背景

上个月笔者的一个同学开了间影视投资公司,出于对创业人员的仰慕和影视投资行业的好奇,我就跟他寒暄了几句,聊天当中他提及到国庆节有部《攀登者》即将上映,预计票房会大好,因为吴京是这部片的主演。然后我就想,目前吴京在国内演员中位列几何呢?正好之前爬了猫眼电影数据,基于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['总票房']            
关注
打赏
1663832040
查看更多评论
0.0412s