数据科学包-Day2-pandas(二)

电影数据分析

利用 Pandas 分析电影评分数据

  • 数据读取
  • 数据合并
  • 统计电影平均得分
  • 统计活跃电影 -> 获得评分的次数越多说明电影越活跃
  • 女生最喜欢的电影排行榜
  • 男生最喜欢的电影排行榜
  • 男女生评分差距最大的电影 -> 某类电影女生喜欢,但男生不喜欢
  • 最具争议的电影排行榜 -> 评分的方差最大
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

数据读取

user_names = ['user_id', 'gender', 'age', 'occupation', 'zip']
users = pd.read_table('ml-1m/users.dat', sep='::', header=None, names=user_names, engine='python')

rating_names = ['user_id', 'movie_id', 'rating', 'timestamp']
ratings = pd.read_table('ml-1m/ratings.dat', sep='::', header=None, names=rating_names, engine='python')

movie_names = ['movie_id', 'title', 'genres']
movies = pd.read_table('ml-1m/movies.dat', sep='::', header=None, names=movie_names, engine='python')
print len(users)
users.head(5)
print len(ratings)
ratings.head(5)
print len(movies)
movies.head(5)

数据合并

data = pd.merge(pd.merge(users, ratings), movies)
len(data)
data.head(5)
data[data.user_id == 1]
# 按性别查看各个电影的平均评分
mean_ratings_gender = data.pivot_table(values='rating', index='title', columns='gender', aggfunc='mean')
mean_ratings_gender.head(5)
# 男女意见想差最大的电影 -> 价值观/品味冲突
mean_ratings_gender['diff'] = mean_ratings_gender.F - mean_ratings_gender.M
mean_ratings_gender.head(5)
mean_ratings_gender.sort_values(by='diff', ascending=True).head(10)
# 活跃电影排行榜
ratings_by_movie_title = data.groupby('title').size()
ratings_by_movie_title.head(5)
# 前十大活跃电影 -> 参与评分人数最多的电影
top_ratings = ratings_by_movie_title[ratings_by_movie_title > 1000]
top_10_ratings = top_ratings.sort_values(ascending=False).head(10)
top_10_ratings
# 前二十大高分电影 -> 平均评分最高的电影
mean_ratings = data.pivot_table(values='rating', index='title', aggfunc='mean')
top_20_mean_ratings = mean_ratings.sort_values(ascending=False).head(20)
top_20_mean_ratings
# 前十大热闹电影的平均评分 -> 不一定越热闹的电影,评分越高
mean_ratings[top_10_ratings.index]
# 前二十大高分电影的热闹程度 -> 不一定评分越高的电影越热闹,可能某个很小众的电影看得人少,但评分很高
ratings_by_movie_title[top_20_mean_ratings.index]
# 十大好电影 -> 活跃度超过 1000 的高分电影
top_10_movies = mean_ratings[top_ratings.index].sort_values(ascending=False).head(10)
top_10_movies
# 把平均评分和热度综合起来
df_top_10_movies = pd.DataFrame(top_10_movies)
df_top_10_movies['hot'] = top_ratings[top_10_movies.index]
df_top_10_movies

核心数据结构

import pandas as pd
import numpy as np

Series

Series 是一维带标签的数组,数组里可以放任意的数据(整数,浮点数,字符串,Python Object)。其基本的创建函数是:

s = pd.Series(data, index=index)
其中 index 是一个列表,用来作为数据的标签。data 可以是不同的数据类型:

  • Python 字典
  • ndarray 对象
  • 一个标量值,如 5
从 ndaray 创建
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
s
s.index
s = pd.Series(np.random.randn(5))
s
s.index
从字典创建
# 空值的默认处理
d = {'a' : 0., 'b' : 1., 'd' : 3}
s = pd.Series(d, index=list('abcd'))
s
从标量创建
pd.Series(3, index=list('abcde'))
print "Missing required dependencies {values}".format(values = ['aaa', 'bbb'])
Series 是类 ndarray 对象
s = pd.Series(np.random.randn(5))
s
s[:3]
np.exp(s)
np.sin(s)
Series 是类字典对象
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
s
s['a']
s['e'] = 5
s['g'] = 100
print s.get('f', np.nan)
标签对齐操作
s1 = pd.Series(np.random.randn(3), index=['a', 'c', 'e'])
s2 = pd.Series(np.random.randn(3), index=['a', 'd', 'e'])
print '{0}\n\n{1}'.format(s1, s2)
s1 + s2
name 属性
s = pd.Series(np.random.randn(5), name='Some Thing')
s
s.name

DataFrame

DataFrame 是二维带行标签和列标签的数组。可以把 DataFrame 想你成一个 Excel 表格或一个 SQL 数据库的表格,还可以相像成是一个 Series 对象字典。它是 Pandas 里最常用的数据结构。

创建 DataFrame 的基本格式是:

df = pd.DataFrame(data, index=index, columns=columns)
其中 index 是行标签,columns 是列标签,data 可以是下面的数据:

  • 由一维 numpy 数组,list,Series 构成的字典
  • 二维 numpy 数组
  • 一个 Series
  • 另外的 DataFrame 对象
从字典创建
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
     'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
pd.DataFrame(d)
pd.DataFrame(d, index=['d', 'b', 'a'])
pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])
d = {'one' : [1, 2, 3, 4],
     'two' : [21, 22, 23, 24]})
pd.DataFrame(d, index=['a', 'b', 'c', 'd'])
从结构化数据中创建
data = [(1, 2.2, 'Hello'), (2, 3., "World")]
pd.DataFrame(data)
pd.DataFrame(data, index=['first', 'second'], columns=['A', 'B', 'C'])
从字典列表创建
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
pd.DataFrame(data)
pd.DataFrame(data, index=['first', 'second'])
pd.DataFrame(data, columns=['a', 'b'])
从元组字典创建
d = {('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
     ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
     ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
     ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
     ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}
# 多级标签
pd.DataFrame(d)
从 Series 创建
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
pd.DataFrame(s)
pd.DataFrame(s, index=['a', 'c', 'd'])
pd.DataFrame(s, index=['a', 'c', 'd'], columns=['A'])
列选择/增加/删除
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', 'four'])
df
df['one']
df['three'] = df['one'] + df['two']
df
df['flag'] = df['one'] > 0
df
del df['three']
df
four = df.pop('four')
four
df['five'] = 5
df
# 指定插入位置
df.insert(1, 'bar', df['one'])
df
使用 assign() 方法来插入新列
df = pd.DataFrame(np.random.randint(1, 5, (6, 4)), columns=list('ABCD'))
df
df.assign(Ratio = df['A'] / df['B'])
df.assign(AB_Ratio = lambda x: x.A / x.B, CD_Ratio = lambda x: x.C - x.D)
df.assign(AB_Ratio = lambda x: x.A / x.B).assign(ABD_Ratio = lambda x: x.AB_Ratio * x.D)

索引和选择

对应的操作,语法和返回结果

选择一列 -> df[col] -> Series
根据行标签选择一行 -> df.loc[label] -> Series
根据行位置选择一行 -> df.iloc[label] -> Series
选择多行 -> df[5:10] -> DataFrame
根据布尔向量选择多行 -> df[bool_vector] -> DataFrame

df = pd.DataFrame(np.random.randint(1, 10, (6, 4)), index=list('abcdef'), columns=list('ABCD'))
df
df['A']
df.loc['a']
df.iloc[0]
df[1:4]
df[[False, True, True, False, True, False]]
数据对齐
df1 = pd.DataFrame(np.random.randn(10, 4), index=list('abcdefghij'), columns=['A', 'B', 'C', 'D'])
df1
df2 = pd.DataFrame(np.random.randn(7, 3), index=list('cdefghi'), columns=['A', 'B', 'C'])
df2
df1 + df2
df1 - df1.iloc[0]
使用 numpy 函数
df = pd.DataFrame(np.random.randn(10, 4), columns=['one', 'two', 'three', 'four'])
df
np.exp(df)
np.asarray(df) == df.values
type(np.asarray(df))
np.asarray(df) == df
# TAB 自动完成功能
df.one

Panel

Panel 是三维带标签的数组。实际上,Pandas 的名称由来就是由 Panel 演进的,即 pan(el)-da(ta)-s。Panel 比较少用,但依然是最重要的基础数据结构之一。

items: 坐标轴 0,索引对应的元素是一个 DataFrame
major_axis: 坐标轴 1, DataFrame 里的行标签
minor_axis: 坐标轴 2, DataFrame 里的列标签

data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
        'Item2' : pd.DataFrame(np.random.randn(4, 2))}
pn = pd.Panel(data)
pn
pn['Item1']
pn.items
# 函数调用
pn.major_xs(pn.major_axis[0])
# 函数调用
pn.minor_xs(pn.major_axis[1])
pn.to_frame()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值