欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Pandas聚类分组处理(Grouping)

程序员文章站 2024-02-10 18:35:22
分组(Group)的理解处理数据时,在一个数据列表中会以某一列的元素作为参考基点,统计该列中每个不重复元素对应其他列的相关数据,这里可能我描述的比较复杂,可以通过下面两张表格数据处理前后帮助理解:源数据为5列,分别为 age、gender、occupation、zip_code;下面我需要对 occupation (职业)这一列进行分组分析、统计一下每类职业对应 gender、age 的最大、最小、平均值,处理结果如下:以上就是聚类分组的简单介绍,Pandas 包里提供了函数 goupby 进...

分组(Group)的理解

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

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

Pandas聚类分组处理(Grouping)

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

Pandas聚类分组处理(Grouping)

以上就是聚类分组的简单介绍,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 三列作为分析对象;

Pandas聚类分组处理(Grouping)

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

Pandas聚类分组处理(Grouping)

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

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

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

然后从大到小进行排序

Pandas聚类分组处理(Grouping)

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

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

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

Pandas聚类分组处理(Grouping)

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

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

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

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

Pandas聚类分组处理(Grouping)

5,多列分组聚类

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

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

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

Pandas聚类分组处理(Grouping)

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聚类分组处理(Grouping)

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

本文地址:https://blog.csdn.net/weixin_42512684/article/details/107081916