子任务一: 数据分析

环境说明:
操作系统:windows 10
IDE:PyCharm Community-2023.2
软件:Python 3.11.4
库包:numpy==1.25.2,pandas==2.1.0,seaborn==0.12.2,matplotlib==3.8.0

1.分别统计各类型的电影总数,展示前五名

import pandas as pd


df = pd.read_csv("movie.csv")

df1 = pd.DataFrame(df)
df1.drop_duplicates("标题", ignore_index=True, inplace=True)


df10 = pd.DataFrame(df1)
df10["类型"] = df10["类型"].apply(lambda x:str(x).split(" / "))
df10 = df10.explode('类型', ignore_index=True)

no1 = df10["类型"].value_counts().head(5)

no1
剧情    1022
动作     640
喜剧     505
冒险     453
爱情     431
Name: 类型, dtype: int64


2、 统计各导演的电影的平均评分排名,展示前五名

rankDf = df1.loc[:,['导演', '评分']]


rankDf['导演'] = rankDf['导演'].apply(lambda x:str(x).split(", "))
rankDf = rankDf.explode("导演", ignore_index=True)

rank = rankDf.groupby("导演").agg({"评分":'mean'}).sort_values(by='评分', ascending=False)
rank["排名"] = rank["评分"].rank(method='first', ascending=False)
rank.head(5)
评分 排名
导演
Gary Halvorson 9.5 1.0
凯文·布赖特 9.5 2.0
西德尼·吕美特 9.1 3.0
亚历克斯·格拉维斯 9.1 4.0
皮特·查科斯 9.0 5.0

3. 统计2012年电影的平均评分保留两位小数

df1['发行年份'] = df1['发行年份'].str.extract(r'(\d{4})')
df2 = df.loc[df['发行年份'] == '2012']
year2012mean = float(df2['评分'].mean())
round(year2012mean, 2)
nan


4、 统计所有评分大于等于8.5的电影的平均时长,取整

df2 = df1.loc[df1["评分"] >= 8.5]
df2 = df2.drop(df2[df2['评分'] == 0].index)
a = round(float(df2['时长'].mean()))
a
126


子任务二:数据可视化

1、 用柱状图显示各评分的电影总数

import matplotlib.pyplot as plt
import seaborn as sns

df3 = df['评分'].value_counts()

df3 = pd.DataFrame({"评分":df3.index, "数量": df3.values})

plt.figure(figsize=(10,6))
sns.set(font='SimHei')
sns.barplot(data=df3.head(5), x='评分', y='数量')
plt.xlabel("评分")
plt.ylabel("数量")
plt.xticks(rotation=45)
plt.show()

png
png

2、 用折线图显示2000年以后的电影平均评分走势

df1['发行年份'] = df1['发行年份'].str.extract(r'(\d{4})')
df4 = df1.loc[df1['发行年份'] >= '2000']
df4 = df4.groupby("发行年份").agg({"评分": 'mean'})

plt.figure(figsize=(10,6))
sns.set(font='SimHei')
sns.lineplot(data=df4, x='发行年份', y='评分', marker='o')


plt.xlabel("发行年份")
plt.ylabel("评分")
plt.xticks(rotation=45)
plt.show()

png
png

3、 用饼图显示各类型电影数数占比

plt.figure(figsize=(10,6))
plt.rcParams['font.sans-serif']=['SimHei']
labels = no1.index
sizes = no1.values
plt.axis("equal")
plt.pie(sizes, labels=labels, autopct="%.1f%%")
plt.title("各类型电影数数占比")
plt.show()


png
png