Python数据清洗
写在前面:
今天的课堂测试是对观影大数据进行数据清洗和数据分析,一开始在数据清洗阶段我采用爱数科数据加工平台对数据集进行清洗,不过对于涉及到数值类型的转换,缺失值填补等清洗模块还是Python进行清洗比较方便。
总结:
# 数据导入 import matplotlib as matplotlib import numpy as np import pandas as pd from pandas import DataFrame, Series from IPython.core.display import display # from wordcloud import WordCloud # 可视化显示在界面 # %matplotlib inline import matplotlib import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来显示中文 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 import seaborn as sns sns.set(color_codes=True) # 学习seaborn参考:https://www.jianshu.com/p/c26bc5ccf604 import json import warnings warnings.filterwarnings('ignore') # from wordcloud import WordCloud, STOPWORDS movies = pd.read_csv('tmdb_5000_movies.csv', encoding='utf_8') credits = pd.read_csv('tmdb_5000_credits.csv', encoding='utf_8') display(movies['genres']) # 两个数据框都有title列,以及movies.riginal_title # 以上三个数据列重复,删除两个 del credits['title'] del movies['original_title'] # 连接两个csv文件 merged = pd.merge(movies, credits, left_on='id', right_on='movie_id', how='left') # 删除不需要分析的列 df=merged.drop(['homepage','overview','spoken_languages','status','tagline','movie_id'],axis=1) display(df.info()) # 查找缺失值记录-release_date df[df.release_date.isnull()] # 填充缺失值 df['release_date'] = df['release_date'].fillna('2014-06-01') # 查找缺失值记录-runtime df[df.runtime.isnull()] # 根据行标签,填充缺失值 df.loc[2656] = df.loc[2656].fillna('94, limit=1') df.loc[4140] = df.loc[4140].fillna('240, limit=1') len(df.id.unique()) #转换日期格式,增加 年份 月份 日 列 #如果日期不符合时间戳限制,则errors ='ignore'将返回原始输入,而不会报错。 #errors='coerce'将强制超出NaT的日期,返回NaT。 df['release_year'] = pd.to_datetime(df.release_date, format = '%Y-%m-%d',errors='coerce').dt.year df['release_month'] = pd.to_datetime(df.release_date).apply(lambda x: x.month) df['release_day'] = pd.to_datetime(df.release_date).apply(lambda x: x.day) df = df[(df.vote_count >= 50) &(df.budget * df.revenue * df.popularity * df.vote_average !=0)].reset_index(drop = 'True') json_column = ['genres', 'keywords', 'production_companies', 'production_countries', 'cast', 'crew'] display(df['genres']) # 1-json本身为字符串类型,先转换为字典列表 for i in json_column: df[i] = df[i].apply(json.loads) # 提取name # 2-将字典列表转换为以','分割的字符串 def get_name(x): return ','.join([i['name'] for i in x]) df['cast'] = df['cast'].apply(get_name) # 提取derector def get_director(x): for i in x: if i['job'] == 'Director': return i['name'] df['crew'] = df['crew'].apply(get_director) for j in json_column[0:4]: df[j] = df[j].apply(get_name) # print("窦一萌怎么学不会!!!") display(df['genres'])
1.pandas读取文件,使用read_csv方法
2.连接两个csv文件:pd.merge(csv1,csv2,left_on(左连接)、right_on(右连接)、how(连接方式) )
3.查找缺失值:isnull()函数 例:df[df.release_date.isnull()]
4.填补缺失值 fillna函数 例:df['release_date'] = df['release_date'].fillna('2014-06-01')
也可根据行标签补全缺失值: 例:df.loc[行数] = df.loc[4140].fillna(缺失值)
5.转换日期格式
6.将嵌套的字典转换成以‘,’分隔的字符串
思路:
columns_name = ['genres', 'keywords', 'production_companies', 'production_countries']
# 遍历要清洗的字典,转换成json格式 for columnss in columns_name: df[columnss] = df[columnss].map(json.loads) # 直接访问name,添加到列表中 def getname(x): list = [] for i in x: list.append(i['name']) return ','.join(list) for columnss in columns_name: df[columnss] = df[columnss].map(getname) display(df['genres'])