前言
最近在看《利用python进行数据分析》这本书,所以想记录的示例都是基于该书提供的数据。
数据路径:data/ch02/movielens/movies.dat
数据截图:
movie.png
一.将数据load进内存
import pandas as pd
from pandas import DataFrame, Series
genres = []
def data_pandas_test():
mnames = ['movie_id', 'title', 'genres']
pdata = pd.read_table('data/ch02/movielens/movies.dat', sep='::', header=None, names=mnames, engine='python')
print pdata
load进内存的数据存在DataFrame结构,截图如下:
movie02.png
03.png
如上所示,数据有三列movie_id, title, genres.(由于使用PyCharm,运行console数据展示换行了,所以分两个图截取)
针对该数据我想统计一下每个不同类型下面有哪些数据以及有哪些电影。看数据可以知道类型列genres一个由分隔符'|'拼接的字符串。所以处理思路如下:
1.将genres列的数据解析到定义的全局列表genres中;
2.根据全局genres列表新增所有类型的列,并填充0;
3.对genres列进行解析,根据内容将新增匹配的类型列的0置为对应title;
4.根据全局genres列表切片获取movie_id,title,类型列名获取子集,对子集进行drop为0的行获取的数据则是对应类型列名所对应的典型编号和电影名称数据,完成不同类型下的电影信息的分离。以下是全部代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
genres = []
def data_pandas_test():
mnames = ['movie_id', 'title', 'genres']
pdata = pd.read_table('pydata/ch02/movielens/movies.dat', sep='::', header=None, names=mnames, engine='python')
pdata = pdata.apply(todo01, axis=1)
count = pdata.count().ix['movie_id']
global genres
for i in genres:
pdata[i] = np.zeros(count)
pdata = pdata.apply(todo02, axis=1)
result = {}
for i in genres:
nn = pdata[['movie_id','title', i]]
result[i] = nn[nn > 0].dropna().drop(i, axis=1)
print result['Comedy']
def todo01(x):
global genres
x_arr_genres = x.genres.split('|')
for i in x_arr_genres:
if i not in genres:
genres.append(i)
return x
def todo02(x):
x_arr_genres = x.genres.split('|')
for i in x_arr_genres:
x[i] = x['title']
return x
if __name__ == "__main__":
data_pandas_test()
最后得到的数据即存在每个以类型为key,结构为DateFrame的电影数据为value的字段中,输出Comedy类型的数据如下:
movie04.png