数据分析系列 之pandas用例分析2

该博客介绍了使用Pandas库进行数据分析的案例,专注于男女性别在电影评分上的差异。首先,讲解了loc和iloc在数据索引上的区别,接着讨论了groupby和pivot_table在数据分组及透视表创建中的应用。通过MovieLens数据集,展示了如何筛选、合并数据,并计算男女用户评分的标准差,进一步通过groupby和pivot_table的方法对比分析性别评分差异。

1 前言
本专题参考学习视频和网上其他大神的资料,推出pandas用例分析2,需要分析的主题是男女生电影评分差异分析。

2 原理
2.1 python pandas 中 loc & iloc 用法区别
loc:基于行标签和列标签(x_label、y_label)进行索引,先行后列,中间用逗号分隔,例如取row1和col1的数据:

frame.loc['row1','col1']

取row1和row2的数据:

frame.loc['row1':'row2',:]

取col1和col2的数据:

frame.loc[:,'col1':'col2']

取前两行和前两列对应数据:

frame.loc['row1':'row2','col1':'col2']

取第一行和第三行、第一列和第五列对应的数据:

frame.loc[['row1','row3'],['col1','col5']]

iloc:基于行索引和列索引(index,columns)取数, 都是从 0 开始:
适用于数据的行标签和列标签名字太长或不容易记的情况
取前两行对应数据:

frame.iloc[0:2,:]

取第一行和第三行、第一列和第五列对应的数据:

frame.iloc[[0,2],[0,4]]

2.2 pandas之groupby分组与pivot_table透视表
groupby:参数为:

groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
#参数解释:
by:用于确定groupby的组;
axis:轴,int值,默认为0;
as_index:对于聚合输出,返回带有组标签的对象作为索引;
sort:排序,关闭此功能以获得更好的性能;
squeeze:尽可能减少返回类型的维度,否则返回一致的类型。
#聚合函数有:
count:分组中非NA值的数量;
sum:非NA值的和;
mean:非NA值的平均值;
median:非NA值的算术中位数;
std、var:无偏(分母为n-1)标准差和方差;
minmax:非NA值的最小值和最大值;
prod:非NA值的积。

pivot_table:是一种可以对数据动态排布并且分类汇总的表格格式。参数为:

pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False)
#参数解释:
data:DataFrame;
values:column to aggregate, optional;
aggfunc:默认是mean;
margins_name:默认是All。

3 实践
3.1 movielens数据源:https://files.grouplens.org/datasets/movielens/ml-100k.zip
3.2 代码参考:

# -*- coding: utf-8 -*-
"""
MovieLens data processing
"""
import pandas as pd
import numpy as np
# Download url: https://files.grouplens.org/datasets/movielens/ml-100k.zip

# 读取数据,注意原始数据中的分隔符差异,前者是'|',后者是制表符'\t',并且需要创建表头信息
unames = ['user id', 'age', 'gender', 'occupation', 'zip code']
users = pd.read_csv('ml-100k/u.user', sep = '|', names = unames)
rnames = ['user id', 'item id', 'rating', 'timestamp']
ratings = pd.read_csv('ml-100k/u.data', sep = '\t', names = rnames)
# 用loc来进行数据筛选
# 注意loc和iloc用法区别,见原理部分
users_df = users.loc[:, ['user id', 'gender']]
ratings_df = ratings.loc[:, ['user id', 'rating']]
# 基于user id进行merge
rating_df = pd.merge(users_df, ratings_df)

# Way 1 - groupby(),计算标准差
result = rating_df.groupby('gender').rating.std()
# 或者:
result = rating_df.groupby('gender').rating.apply(pd.Series.std)
print(result)
# Way 1 - pivot_table(),透视表功能,可以实现数据的分类排列,可以实现group by的功能
result = pd.pivot_table(rating_df, index = ['gender'], values = 'rating', aggfunc = pd.Series.std)
print(result)

# Way 2 - groupby(),先计算用户的均值,再计算标准差
df_temp = rating_df.groupby(['user id', 'gender']).apply(np.mean)
result = df_temp.groupby('gender').rating.apply(pd.Series.std)
print(result)
# Way 2 - pivot_table(),返回的结果默认是mean
gender_table = pd.pivot_table(rating_df, index = ['gender', 'user id'], values = 'rating')
# 透视表的结果用query来处理
Female_df = gender_table.query("gender == ['F']")
Male_df = gender_table.query("gender == ['M']")
Female_std = pd.Series.std(Female_df)
Male_std = pd.Series.std(Male_df)
print('Gender', '\nF\t%.6f' % Female_std, '\nM\t%.6f' % Male_std)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值