如题,分析内容是电影题材和电影利润之间的关系。
其中电影题材的数据格式比较特殊,那么就用这个案例体现怎么处理此类数据格式。
从数据中看,每个电影对应好几种题材(genres)。
那么,我们的大概思路是,将数据处理成(一个电影对应)一个题材,对应一个利润。
话不多说我们先放代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#读取数据
df = pd.read_csv('movie_metadata.csv',
usecols=[0,1,2,3,4,5,6,7,8,9,10,11,13,15,27])
data = df.dropna(how='any')
#处理数据
genres_data = pd.DataFrame(columns=['genres','gross'])
for i,row_data in data.iterrows():
genres = row_data['genres'].split('|')
n_geners = len(genres)
dict_obj={}
dict_obj['genres'] = genres
dict_obj['gross'] = [row_data['gross']] * n_geners
genres_df = pd.DataFrame(dict_obj)
genres_data = genres_data.append(genres_df)
# genres_data.to_csv('genres_data.csv',index=None)
genres_data
#绘制图片1
genres_count = genres_data.groupby('genres').size()
plt.figure(figsize=(15.0,10.0))
genres_count.plot(kind='barh')
plt.savefig('genres_count.png')
plt.show()
#绘制图片2
genres_gross = genres_data.groupby('genres')['gross'].sum()
plt.figure(figsize=(15.0,10.0))
genres_gross.plot(kind='barh')
plt.savefig('genres_gross.png')
plt.show()
其中处理数据的部分是特点。
1.新建一个空白的df用于存放结果,我们对于结果的设计如下图:
每一行的标识可以理解为 movie1+genres1,movie1+genres2.......movieN+genresN
genres_data = pd.DataFrame(columns=['genres','gross'])
一开始对迭代器不太了解,可以通过下面一段代码测试查看迭代器取数的结果。
for i,row_data in data.iterrows():
print(i)
print(row_data)
print('*'*20)
打印出来的row_data我理解上是一个series。
取出每行的genres,用split()拆分
for i,row_data in data.iterrows():
genres = row_data['genres']
print(genres)
拆分后
for i,row_data in data.iterrows():
genres = row_data['genres'].split('|')
print(genres)
准备新建一个空字典,后期通过字典将数据转换成dataframe,再将dataframe拼接就可以。 字典的预期效果如图
字典中‘gross’的数据
for i,row_data in data.iterrows():
genres = row_data['genres'].split('|')
n_genres = len(genres)
dict_obj={}
dict_obj['gross']=[row_data['gross']]*n_genres
print(dict_obj['gross'])
# print([row_data['gross']])
用将字典转换成一个个的dataframe。
for i,row_data in data.iterrows():
genres = row_data['genres'].split('|')
n_genres = len(genres)
dict_obj={}
dict_obj['gross']=[row_data['gross']]*n_genres
dict_obj['genres']=genres
genres_df=pd.DataFrame(dict_obj)
print(genres_df)
最终画出来的图的效果。