Pandas数据处理(三) — 分组聚类(groupby)

旧街凉风 提交于 2021-02-11 13:36:19

点击上方 Z先生点记,加为星标
第一时间收到 Python 技术干货!

分组(Group)的理解

处理数据时,在一个数据列表中会以某一列的元素作为参考基点,统计该列中每个不重复元素对应其他列的相关数据,这里可能我描述的比较复杂,可以通过下面两张表格数据处理前后帮助理解:

源数据为5列,分别为 age、gender、occupation、zip_code;

下面我需要对 occupation (职业)这一列进行分组分析、统计一下每类职业对应 gender、age 的最大、最小、平均值,处理结果如下:

以上就是聚类分组的简单介绍,Pandas 包里提供了函数  goupby 进行日常操作,本文将基于 Pandasgroupby 的用法做一个简单了解

1,库导入,数据读取

import pandas as pd

users = pd.read_table("https://raw.githubusercontent.com/justmarkham/DAT8/master/data/u.user",sep ="|",index_col = 'user_id')
users.head()

数据以 age,gender,occupation ,zip_code 作为一条样本存入数据集中,接下来的处理将围绕 age,gender,occupation 三列作为分析对象;

2,把 gender 转化为编码形式

def gender_to_numric(x):
    if x=='M':
        return 1
    if x =="F":
        return 0

# 利用新的函数创建新的列;
users['gender_n'] = users['gender'].apply(gender_to_numric)
users

F 变为 0,M 设为 1

3,在2 的前提下,统计每类职业中的男性比例

value_counts() 统计某一列样本总数

a = users.groupby("occupation").gender_n.sum()/users.occupation.value_counts()*100
a.sort_values(ascending =False)

然后从大到小进行排序

4,以 occupation 作为分组基点,统计每类职业年龄最大、最小、平均值

这里用到 agg() 函数,起到数据管道聚类效果

users.groupby("occupation").age.agg(["min","max","mean"])

对多列数据同时进行统计时,也是用 agg() 函数,区别是这里用的是字典形式(dict):键名为列名,键值为需要统计的数据类别例如 max、min、mean、count 等关键字,以列表形式写入;

users.agg({列名:[“mean”,“max”,"min"]})

以本文数据为准,想同时查看年龄,性别的统计数据,可用下面命令;

users.groupby("occupation").agg({"age":['mean','max','min'],'gender_n':['sum','count']})

5,多列分组聚类

上面我们对 occupation 这一列进行了分组聚类分析,这里在 occupation 分组中再对 性别进行分组聚类,并统计各个职业中各性别占比总数

groupby(['列名1','列名2'…])  # 列名的先后顺序代表的分组聚类的先后顺序:

# 求在每个职业中男女各占比例
gender_occp = users.groupby(["occupation","gender"]).agg({"gender":"count"})
gender_occp

6,在 5 的基础上,统计每个职业中性别占比比例

统计每个职业中性别占比基本思路如下:

  • 1,统计每个职业中各性别数;

  • 2,统计每个职业中总样本数;

  • 1 和 2 基于 occupation 这一列进行除法运算;

代码部分

# 求在每个职业中男女各占比例
gender_occp = users.groupby(["occupation","gender"]).agg({"gender":"count"})

# 为每一个职业计算 count
occup_count = users.groupby(['occupation']).agg("count")

# gender_occp

# 进行除法运算
occup_gender = gender_occp.div(occup_count,level = "occupation")*100


# 只筛选出 gender列
occup_gender.loc[:,'gender']

这里用到 DataFram.div 函数 ,对两个 DataFrame 基于某一列作为参照列做除法,最终得到的数据类型为 float ;level 参数用于指定参考列;除了 div 之外,Pandas 还提供 add、sub、mul、pow 等运算操作函数,用法与 div 方法相似

结果如下:

以上就是本篇基本内容啦,最后感谢阅读!



有什么疑问,可以扫描下方二维码加我微信
欢迎交流探讨!




推荐阅读:


Pandas 数据处理(一) ——  几个简单函数掌握!

Pandas 数据处理(二) —— 条件筛选与排序!

本文分享自微信公众号 - Z先生点记(gh_683d048a482a)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!