子任务一: 数据分析
环境说明:
操作系统: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()
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()
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()