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

Posted 琅晓琳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析系列 之pandas用例分析2相关的知识,希望对你有一定的参考价值。

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)

以上是关于数据分析系列 之pandas用例分析2的主要内容,如果未能解决你的问题,请参考以下文章

Pandas数据分析:处理文本数据(str/object)各类操作+代码一文详解

python之数据分析pandas

OSI分析之数据链路层

OSI分析之数据链路层

OSI分析之数据链路层

OSI分析之数据链路层