1 数据筛选
1)首先完成的是选取字段中包含‘中国大陆’的电影,这样自然就只剩下了中国大陆自己拍摄的电影以及合拍的电影
df_loc = df[['电影名称','制片国家/地区','豆瓣评分']][df['制片国家/地区'].notnull()]
df_loc = df_loc[df_loc['制片国家/地区'].str.contains('中国大陆')]
2)筛选出电影合作的不同国家,去重
loclst = []
for i in df_loc['制片国家/地区'].str.replace(' ','').str.split('/'):
#print(i)
loclst.extend(i)
loclst = list(set(loclst))
print(loclst)
–> 输出结果为:(这一步和上一篇选择不同题材的电影字段的处理是一致的)
['南非', '法国', '英国', '中国', '马来西亚', '中国大陆', '澳大利亚', '比利时', '朝鲜', '台湾', '韩国',
'新加坡', '美国', '俄罗斯', '泰国', '加拿大', '日本', '西班牙', 'Malaysia', '蒙古国', '印度', '新西兰',
'香港', '以色列', '卢森堡', '德国', '丹麦']
3) 对于上述列表中的数据需要进行处理
比如,这里首先要去掉的是‘中国大陆’和‘中国’两个内容,其次由于研究的是和什么国家的合作,就要去掉的‘台湾’和‘香港’两个数据,最后要处理的就是‘马来西亚’
和‘Malaysia’
两个数据,这两个本身就是一个国家,只是表述的方式不一样,这里需要将两个数据合并成为一个数据
loclst.remove('中国')
loclst.remove('中国大陆')
loclst.remove('台湾')
loclst.remove('Malaysia')#注意这里删除的数据,因为马来西亚和这个英文名重名了,而且还需要对这里的数据再进行清洗
loclst.remove('香港')
print(loclst)
–> 输出结果为:(去除噪音数据)
['南非', '法国', '英国', '马来西亚', '澳大利亚', '比利时', '朝鲜', '韩国', '新加坡', '美国', '俄罗斯',
'泰国', '加拿大', '日本', '西班牙', '蒙古国', '印度', '新西兰', '以色列', '卢森堡', '德国', '丹麦']
既然上面是把'Malaysia'
数据给删除了,那么在原始数据上就应该把这个数据给合并到'马来西亚'
对应的数据上
print(df_loc[df_loc['制片国家/地区'].str.contains('Malaysia')],'\n')
#输出包含'Malaysia'的电影数据
print(df_loc[df_loc['制片国家/地区'].str.contains('马来西亚')],'\n')
#输出包含'马来西亚'的电影数据
df_loc['制片国家/地区'] = list(map(lambda x:x.replace('Malaysia','马来西亚'),df_loc['制片国家/地区'] ))
#将'Malaysia'的数据转换为'马来西亚'数据
print(df_loc[df_loc['制片国家/地区'].str.contains('马来西亚')])
#最后汇总输出
–> 输出结果为:(这一步完成的就是特殊数据的处理,也是这部分最重要的环节)
电影名称 制片国家/地区 豆瓣评分
1738 夜·明 中国大陆 / Malaysia 7.3
电影名称 制片国家/地区 豆瓣评分
547 后备空姐 中国大陆 / 马来西亚 2.9
944 海鲜陆战队 SeeFood 中国大陆 / 马来西亚 5.8
电影名称 制片国家/地区 豆瓣评分
547 后备空姐 中国大陆 / 马来西亚 2.9
944 海鲜陆战队 SeeFood 中国大陆 / 马来西亚 5.8
1738 夜·明 中国大陆 / 马来西亚 7.3
2 封装函数生成DataFrame数据
1) 这里的操作可以直接将f1函数中的代码复制过来,将里面的type
修改为loc
即可,如下
def f2(data,loci):
dic_loc_lp = {}
datai = data[data['制片国家/地区'].str.contains(loci)]
#创建空字典,筛选出该题材的电影
lp_pre_i = len(datai[datai['豆瓣评分']<4.3])/len(datai)
#计算烂片比例
dic_loc_lp['loc_name'] = loci
dic_loc_lp['loc_count'] = len(datai)
dic_loc_lp['loc_lp_pre'] = lp_pre_i
return dic_loc_lp
2) 接着就是遍历循环处理后的列表数据,然后调用函数,并对合作的单个国家的相关情况进行输出,并保存到新的列表中以便后面生成DataFrame
lst_loc_lp = []
for i in loclst:
dici = f2(df_loc,i)
print(f2(df_loc,i))
lst_loc_lp.append(dici)
–> 输出结果为:
{'loc_name': '南非', 'loc_count': 1, 'loc_lp_pre': 0.0}
{'loc_name': '法国', 'loc_count': 10, 'loc_lp_pre': 0.1}
{'loc_name': '英国', 'loc_count': 4, 'loc_lp_pre': 0.75}
{'loc_name': '马来西亚', 'loc_count': 3, 'loc_lp_pre': 0.3333333333333333}
{'loc_name': '澳大利亚', 'loc_count': 3, 'loc_lp_pre': 0.0}
{'loc_name': '比利时', 'loc_count': 2, 'loc_lp_pre': 0.5}
{'loc_name': '朝鲜', 'loc_count': 1, 'loc_lp_pre': 1.0}
{'loc_name': '韩国', 'loc_count': 19, 'loc_lp_pre': 0.15789473684210525}
{'loc_name': '新加坡', 'loc_count': 3, 'loc_lp_pre': 0.3333333333333333}
{'loc_name': '美国', 'loc_count': 21, 'loc_lp_pre': 0.3333333333333333}
{'loc_name': '俄罗斯', 'loc_count': 1, 'loc_lp_pre': 0.0}
{'loc_name': '泰国', 'loc_count': 2, 'loc_lp_pre': 0.5}
{'loc_name': '加拿大', 'loc_count': 6, 'loc_lp_pre': 0.0}
{'loc_name': '日本', 'loc_count': 14, 'loc_lp_pre': 0.07142857142857142}
{'loc_name': '西班牙', 'loc_count': 1, 'loc_lp_pre': 1.0}
{'loc_name': '蒙古国', 'loc_count': 1, 'loc_lp_pre': 0.0}
{'loc_name': '印度', 'loc_count': 1, 'loc_lp_pre': 0.0}
{'loc_name': '新西兰', 'loc_count': 1, 'loc_lp_pre': 1.0}
{'loc_name': '以色列', 'loc_count': 1, 'loc_lp_pre': 0.0}
{'loc_name': '卢森堡', 'loc_count': 1, 'loc_lp_pre': 0.0}
{'loc_name': '德国', 'loc_count': 4, 'loc_lp_pre': 0.25}
{'loc_name': '丹麦', 'loc_count': 1, 'loc_lp_pre': 0.0}
3) 生成DataFrame
数据,然后取合作次数大于3次的烂片排行前20的数据
df_loc_lp = pd.DataFrame(lst_loc_lp)
df_loc_lp = df_loc_lp[df_loc_lp['loc_count']>=3]
loc_lp_top20 = df_loc_lp.sort_values(by = 'loc_lp_pre',ascending = False).set_index(np.arange(len(df_loc_lp)))
print(loc_lp_top20)
–> 输出结果为:(实际上只有十条满足的数据)