美文网首页
Pandas数据处理(三) — 聚类分组处理(Grouping)

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

作者: 小张Python | 来源:发表于2020-07-02 12:49 被阅读0次

    分组(Group)的理解

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

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

    Snipaste_2020-06-25_09-52-52.png

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

    Snipaste_2020-06-25_09-51-40.png

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

    1.png

    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

    1_1.png

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

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

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

    然后从大到小进行排序

    2.png

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

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

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

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

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

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

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

    5,多列分组聚类

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

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

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

    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 方法相似

    最终结果如下:

    3_1.png

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

    相关文章

      网友评论

          本文标题:Pandas数据处理(三) — 聚类分组处理(Grouping)

          本文链接:https://www.haomeiwen.com/subject/haalqktx.html