任务B-数据分析与可视化 解析

子任务一: 数据分析

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

import pandas as pd

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

df.drop_duplicates("标题", ignore_index=True, inplace=True)  # 删除重复标题 
df

drop_duplicates用来删除重复标题 给他穿个inplace表示在原数据上进行修改

movietypeSum = df['类型'].apply(lambda x:str(x).split(" / "))
movietypeSum = movietypeSum.explode("类型")

movietypeSum = movietypeSum.value_counts()
movietypeSum.head()

apply函数 将类型这一列分割

explode 将分割完的列表 惊醒拆分 拆分成单独的一列

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

movieMeanMovie = df.loc[:,['导演', "评分"]]

movieMeanMovie['导演'] = movieMeanMovie['导演'].apply(lambda x:str(x).split(", "))
movieMeanMovie = movieMeanMovie.explode("导演", ignore_index=True)
movieMeanMovie = movieMeanMovie.groupby("导演").agg({"评分":'mean'}).sort_values(by='评分', ascending=False)
movieMeanMovie.head()

发现一行中导演可以有时有很多个

还是老样子进行分隔

然后进行分组 聚合 算出各导演的评分平均分 然后进行降序排序

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

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

pandas中的字符串方法 中有一个extract 可以用正则提取数据

写正则 提取前四个数字

然后 按条件提取 发行年份 求平均值 后保留小数即可

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

movieDuration = df.loc[df['评分'] > 8.5]
movieDuration.drop(movieDuration[movieDuration['时长'] == 0].index)
round(float(movieDuration['时长'].mean()))

按条件提取

drop函数中需要注意 是先条件提取出时长为0的 然后获取这些为0的索引 然后删除

子任务二:数据可视化

import matplotlib.pyplot as plt
import seaborn as sns


scoreMoveSum = df['评分'].value_counts()
scoreMoveSum = pd.DataFrame({"评分":scoreMoveSum.index, "数量": scoreMoveSum.values})


plt.figure(figsize=(10,6))
sns.set(font='SimHei')
sns.barplot(data=scoreMoveSum.head(5), x='评分', y='数量')
plt.xlabel("评分")
plt.ylabel("数量")
plt.xticks(rotation=45)    # 将文字 倾斜45度 
plt.show()

output
output

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

movieYear2000 = df.loc[df['发行年份'] >= '2000']
movieYear2000 = movieYear2000.groupby("发行年份").agg({"评分": 'mean'})

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


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

outpu1t
outpu1t

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

tmpMovie = movietypeSum.head(10)

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

output2
output2