豆瓣电影Top_250_Data_analysis(
运行在jupyter notebook环境
)
- 一、 数据收集、加载数据 并查看
- 1.1 收集数据 爬虫详细过程请点击
- 1.2 抓取数据问题:
- 1.3 加载数据并查看:
- 二、数据合并(将这两个互有缺失值的DataFrame合并)
- 三、数据清洗(消耗40%时间)
- 3.1 查看所有数据 : 数据去重 df.duplicated()
- 3.2 数据格式,内容清洗
- 3.2.1 国家(地区)内容清洗
- 3.2.2 电影类型genre(类似于区域内容清洗)
- 3.2.3 电影语言:
- 3.2.4 导演
- 3.2.5 演员(cast)
- 3.2.5 时长(movie_duration)
- 3.2.6 电影标记(tags)
- 3.2.7 上映时间(init_year)
- 3.2 缺失值检查与查看
- 四、数据统计与分析
- 4.1 数值型列的数据统计
- 4.2 电影排名分析
- 4.3 按评分-top10分析
- 4.4 上榜次数统计分析
- 五、数据分析与可视化展示(matplotlib)
- 5.1 matplotlib 可视化包基本环境配置
- 5.2 评分 与排名
- 5.3 评论人数 与排名
- 5.4 电影时长 与排名
- 5.5 上映年份 与排名
- 5.6 国家/地区 与排名
- 5.7 语言 与排名
- 5.8 电影类型 与排名
- 5.9 电影标签热度词云统计 与排名
- 六、数据分析与可视化展示
- 6.1 安装pyecharts 可视化基本环境配置
- 6.2 电影类型-排名
- 6.3 按评分占比统计
- 6.4 国家地区-排名
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pyecharts import Bar,Line,Pie
from pandas import
一、 数据收集、加载数据 并查看
1.1 收集数据
抓取排名,电影名,导演,主演,上映日期,制片国家/地区,类型。
评分,评论数量,一句话评价,已经电影链接
top250 网址:https://movie.douban.com/top250
选用Python3 引入 url.requests BeautifulSoup4 来抓取
1.2 抓取数据问题:
原来页面的缺失信息(如:导演,演员等)
原来页面的本来就没有电影语言,时长,tag
解决方法:
取出当前数据的最后一列的url
解析url取出电影唯一的id
根据id得到详细页面,抓取信息
https://api.douban.com/v2/movie/id
1.3 加载数据并查看:
df_1 = pd.read_csv('./csv/top250_f1.csv',sep = '#')
df_2 = pd.read_csv('./csv/top250_f2.csv',sep = '#')
df_1.head() #查看前五条数据
#df_2.head() #查看前五条数据
| num | title | director | role | init | area | genre | rat | com | comment | url |
0 | 1 | 肖申克的救赎 | 弗兰克·德拉邦特 Frank Darabont | 蒂姆·罗宾斯 Tim Robbins | 1994 | 美国 | [‘犯罪 剧情’] | 9.6 | 964842 | 希望让人自由。 | https://movie. douban.com /subject/1292052/ |
1 | 2 | 霸王别姬 | 陈凯歌 Kaige Chen | 张国荣 Leslie Cheung | 1993 | 中国大陆 香港 | [‘剧情 爱情 同性’] | 9.5 | 699930 | 风华绝代。 | https://movie. douban.com /subject/1291546/ |
2 | 3 | 这个杀手不太冷 | 吕克·贝松 Luc Besson | 让·雷诺 Jean Reno | 1994 | 法国 | [‘剧情 动作 犯罪’] | 9.4 | 912435 | 怪蜀黍和小萝莉不得不说的故事。 | https://movie. douban.com /subject/1295644/ |
3 | 4 | 阿甘正传 | Robert Zemeckis | Tom Hanks | 1994 | 美国 | [‘剧情 爱情’] | 9.4 | 775889 | 一部美国近现代史。 | https://movie. douban.com/ subject/1292720/ |
4 | 5 | 美丽人生 | 罗伯托·贝尼尼 Roberto Benigni | 罗伯托·贝尼尼 Roberto Beni…’] | 1997 | 意大利 | [‘剧情 喜剧 爱情 战争’] | 9.5 | 453651 | 最美的谎言。 | https://movie. douban.com/ subject/1292063/ |
二、数据合并(将这两个互有缺失值的DataFrame合并)
将df_1与df_2合并数据
数据分布在两个文件中:
取 top250_f1.csv 中的 num(排名),title(电影名),init_year(上映时间),area(国家/地区)
和 top250_f2.csv 中的 language(语言),director(导演),cast(主演),movie_duration(时长),\
tags(标签)这些列进行分析。
df_1_cut = df_1[['num','title','init_year','area','genre','rating_num','comment_num']]
df_2_cut = df_2[['num','language','director','cast','movie_duration','tags']]
df = df.merge(df_1_cut,df_2_cut,how = 'outer',on = 'num') #外连接,合并标准on = 'num'
df.head() #查看前五条信息
#df.tail() 查看后五条信息
#df.info()
| nu | title | init | area | genre | rat | com | lang | director | cast | movie_ | tags |
0 | 1 | 肖申克的救赎 | 1994 | 美国 | [‘犯罪 剧情’] | 9.6 | 964842 | [‘英语’] | [‘弗兰克·德拉邦特 Frank Darabont’] | [‘蒂姆·罗宾斯 Tim Robbins’, ‘摩根·弗里曼 Morgan Freeman’… | [‘142 分钟’] | [{‘count’: 197742, ‘name’: ‘经典’}, {‘count’: 16… |
1 | 2 | 霸王别姬 | 1993 | 中国大陆 香港 | [‘剧情 爱情 同性’] | 9.5 | 699930 | [‘汉语普通话’] | [‘陈凯歌 Kaige Chen’] | [‘张国荣 Leslie Cheung’, ‘张丰毅 Fengyi Zhang’, ‘巩俐 … | [‘171 分钟’] | [{‘count’: 124150, ‘name’: ‘经典’}, {‘count’: 63… |
2 | 3 | 这个杀手不太冷 | 1994 | 法国 | [‘剧情 动作 犯罪’] | 9.4 | 912435 | [‘英语’, ‘意大利语’, ‘法语’] | [‘吕克·贝松 Luc Besson’] | [‘让·雷诺 Jean Reno’, ‘娜塔莉·波特曼 Natalie Portman’, … | [‘110分钟(剧场版)’, ‘133分钟(国际版)’] | [{‘count’: 150097, ‘name’: ‘经典’}, {‘count’: 85… |
3 | 4 | 阿甘正传 | 1994 | 美国 | [‘剧情 爱情’] | 9.4 | 775889 | [‘英语’] | [‘Robert Zemeckis’] | [‘Tom Hanks’, ‘Robin Wright Penn’, ‘Gary Sinis… | [‘142 分钟’] | [{‘count’: 179046, ‘name’: ‘励志’}, {‘count’: 13… |
4 | 5 | 美丽人生 | 1997 | 意大利 | [‘剧情 喜剧 爱情 战争’] | 9.5 | 453651 | [‘意大利语’, ‘德语’, ‘英语’] | [‘罗伯托·贝尼尼 Roberto Benigni’] | [‘罗伯托·贝尼尼 Roberto Benigni’, ‘尼可莱塔·布拉斯基 Nicolet… | [‘116分钟’] | [{‘count’: 70710, ‘name’: ‘意大利’}, {‘count’: 67… |
三、数据清洗(消耗40%时间)
3.1 查看所有数据 : 数据去重 df.duplicated()
df.duplicated().head() #返回 True,则有重复项,反之亦然
df.duplicated().value_counts()
df.title.unique() #检查某一列是否有重复电影名
df.num.unique() #检查某一列是否有并列排名
3.2 数据格式,内容清洗
◆去除多余字段-去除字段两侧['']形式,可以用str分数字符串
df['genre'] = df['genre'].str[2:-2]
df['language'] = df['language'].str[2:-2]
df['director'] = df['director'].str[2:-2]
df['cast'] = df['cast'].str[2:-2]
df['movie_duration'] = df['movie_duration'].str[2:-2]
df.head()
num…genrerating
_numcomme
nt_numlang
uagedirectorcastmovie_
durationtags01…犯罪 剧情9.6964842英语弗兰克·德拉邦特 Frank Darabont蒂姆·罗宾斯 Tim Robbins’, ‘摩根·弗里曼 Morgan Freeman’, …142 分钟[{‘count’: 197742, ‘name’: ‘经典’}, {‘count’: 16…12…剧情 爱情 同性9.5699930汉语普通话陈凯歌 Kaige Chen张国荣 Leslie Cheung’, ‘张丰毅 Fengyi Zhang’, ‘巩俐 Li…171 分钟[{‘count’: 124150, ‘name’: ‘经典’}, {‘count’: 63…23…剧情 动作 犯罪9.4912435英语’, ‘意大利语’, ‘法语吕克·贝松 Luc Besson让·雷诺 Jean Reno’, ‘娜塔莉·波特曼 Natalie Portman’, ‘加…110分钟(剧场版)’, ‘133分钟(国际版)[{‘count’: 150097, ‘name’: ‘经典’}, {‘count’: 85…34…剧情 爱情9.4775889英语Robert ZemeckisTom Hanks’, ‘Robin Wright Penn’, ‘Gary Sinise’…142 分钟[{‘count’: 179046, ‘name’: ‘励志’}, {‘count’: 13…45…剧情 喜剧 爱情 战争9.5453651意大利语’, ‘德语’, ‘英语罗伯托·贝尼尼 Roberto Benigni罗伯托·贝尼尼 Roberto Benigni’, ‘尼可莱塔·布拉斯基 Nicoletta…116分钟[{‘count’: 70710, ‘name’: ‘意大利’}, {‘count’: 67…
3.2.1 国家(地区)内容清洗
#对于area列,由多个国家地区之间合作的电影,中间用空格隔开,
#用str.split()分列,再应用apply(pd.Series)作用到每一行或列
area_split = df['area'].str.split('').apply(pd.Series)
area_split.head()
#对每列的值重合的作了一个汇总统计,同时NaN用0填充
a = area_split.apply(df.value_counts).fillna('0')
#更改列名,转换数据类型(object->int)
a.columns = ['area_1','area_2','area_3','area_4','area_5']
a['area_1'] = a['area_1'].astype(int)
a['area_2'] = a['area_2'].astype(int)
a['area_3'] = a['area_3'].astype(int)
a['area_4'] = a['area_4'].astype(int)
a['area_5'] = a['area_5'].astype(int)
#将每一行的数据汇总后,变成一列显示(行汇总)
a = a.apply(lambda x:x.sum().axis=1)
#包装成一个标准的 DataFrame
area_c = df.DataFrame(a,column = ['counts'])
area_c.head()