前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据分组

数据分组

作者头像
见贤思齊
发布2020-08-05 15:50:55
4.5K0
发布2020-08-05 15:50:55
举报
文章被收录于专栏:初见Linux初见Linux

数据分组就是根据一个或多个键(可以是函数、数组或df列名)将数据分成若干组,然后对分组后的数据分别进行汇总计算,并将汇总计算后的结果合并被用作汇总计算的函数称为就聚合函数。 Python中对数据分组利用的是 groupby() 方法,类似于sql中的 groupby。

1.分组键是列名

分组键是列名时直接将某一列或多列的列名传给 groupby() 方法,groupby() 方法就会按照这一列或多列进行分组。

代码语言:javascript
复制
groupby():
    """
        功能: 根据分组键将数据分成若干组。
        参数: 
            ①分组键是列名: 单个列名直接写(按一列进行分组),多个列名以列表的形式传入(这就是按多列进行分                        组)。
            ②分组键是Series: 单个Series直接写,多个Series以列表的形式传入。
            
        返回值:  注意返回的是**DataFrameGroupBy对象**,而不是一个DataFrame对象。
                DataFrameGroupBy对象包含着分组后的若干数据,但是没有直接显示出来,需要对这些分组数据                进行汇总计算后才会显示。
    """
(1)按一列进行分组
代码语言:javascript
复制
import pandas as  pd

df = pd.DataFrame([[99,"A类","一线城市","是",6,20,0],
                   [100,"B类","三线城市","否",37,27,35],
                   [200,"A类","二线城市","是",8,1,8],
                   [300,"C类","一线城市","是",7,8,14],
                   [400,"B类","三线城市","否",9,12,4],
                   [520,"A类","二线城市","是",42,20,55]],
                  columns=["用户ID","客户分类","区域","是否省会","7月销量","8月销量","9月销量"])

#以 客户分类 这列进行分组
df.groupby("客户分类")
    #<pandas.core.groupby.groupby.DataFrameGroupBy object at 0x000001ED7CB17780>
    
#对分组后数据进行计数运算
df.groupby("客户分类").count()

#对分组后数据进行求和运算
df.groupby("客户分类").sum()  #只会对数据类型为数值(int,float)的列才会进行运算

温故知新,回忆一下有哪些汇总运算: count 非空值计数、sum 求和、mean 求均值、max 求最大值、min 求最小值、median 求中位数、 mode 求众数、var 求方差、std 求标准差、quantile 求分位数

(2)按多列进行分组

按多列进行分组,只要将多个列名以列表的形式传给 groupby() 即可。

代码语言:javascript
复制
#以 客户分类、区域 这2列进行分组
df.groupby(["客户分类","区域"])

#对分组后数据进行计数运算
df.groupby(["客户分类","区域"]).count()

#对分组后数据进行求和运算
df.groupby(["客户分类","区域"]).sum()  #只会对数据类型为数值(int,float)的列才会进行运算

无论分组键是一列还是多列,只要直接在分组后的数据进行汇总运算,就是对所有可以计算的列进行计算。 有时不需要所有的列进行计算,这时就可以把想要计算的列(可以是单列,可以是多列)通过索引的方式取出来,然后在这个基础上进行汇总运算。

代码语言:javascript
复制
df.groupby("客户分类")["7月销量"].sum()

2.分组键是Series

DataFrame的其中一列取出来就是一个Series ,如df["客户分类"]。 其实这和列选择一样,传入多个Series时,是列表中的列表;传入一个Series直接写就可以。

(1)按照一个Series进行分组
代码语言:javascript
复制
#以 客户分类 这列进行分组

df.groupby(df["客户分类"])

#对分组后数据进行计数运算
df.groupby(df["客户分类"]).count()

#对分组后数据进行求和运算
df.groupby(df["客户分类"]).sum()  #只会对数据类型为数值(int,float)的列才会进行运算
(2)按照多个Series进行分组
代码语言:javascript
复制
#以 客户分类、区域 这2列进行分组
df.groupby([df["客户分类"],df["区域"]])

#对分组后数据进行计数运算
df.groupby([df["客户分类"],df["区域"]]).count()

#对分组后数据进行求和运算
df.groupby([df["客户分类"],df["区域"]]).sum()  #只会对数据类型为数值(int,float)的列才会进行运算
代码语言:javascript
复制
#有时不需要所有的列进行计算,这时就可以把想要计算的列

df.groupby([df["客户分类"],df["区域"]])["8月销量"].sum()

总结: ​ 上述两种方法无论分组键是列名,还是分组键是Series,最后结果都是一样的,不同之处就是给 groupby() 方法传入了什么。


3.神奇的aggregate方法

前面用的聚合函数都是直接在DataFrameGroupBy上调用,这样做每一列都是同一种汇总运算,且一次只能使用一种汇总运算aggregate神奇就神奇在一次可以使用多种汇总方式是,还可以针对不同的列做不同的汇总运算

代码语言:javascript
复制
aggregate():
    """
        功能: 一次可以使用多种汇总方式;针对不同的列做不同的汇总运算。
        参数: 
            ① 一次可以使用多种汇总方式: 多种汇总方式以**列表**的形式传入(且汇总函数是用字符串形式)。
            ② 针对不同的列做不同的汇总运算:字典形式,*键名*是*列名*,*键值*是*汇总方式*字符串形式。
        返回值: 一个DataFrame对象。
    """    
代码语言:javascript
复制
import pandas as pd

df = pd.DataFrame({"用户ID":[99,100,200,300,520],
                   "客户分类":["A类","B类","A类","C类","B类"],
                   "3月销量":[6,37,8,7,9],
                   "8月销量":[20,27,1,8,12]
                  })

#以 客户分类 这列进行分类
df.groupby("客户分类")      #分组键是列名
df.groupby(df["客户分类"])  #分组键是Series

#对分组后的数据进行 计数运算 和 求和运算
df.groupby("客户分类").aggregate(["count","sum"])

#对分组后的数据的  用户ID列进行计数运算,8月销量进行求和运算
df.groupby(df["客户分类"]).aggregate({"用户ID":"count","8月销量":"sum"})

4.对分组后的结果重置索引 reset_index()

根据上述数据分组代码运行得到的结果,DataFrameGroupBy 对象经过汇总运算后得到的结果的形式并不是标准的DataFrame形式。为了接下来对分组结果进行进一步处理与分析,需要把非标准的转化成标准的DataFrame形式,利用的方法是重置索引 reset_index()。

代码语言:javascript
复制
df = pd.DataFrame({"用户ID":[99,100,200,300,520],
                   "客户分类":["A类","B类","A类","C类","B类"],
                   "3月销量":[6,37,8,7,9],
                   "8月销量":[20,27,1,8,12]
                  })

#以 客户分类 这列进行分类,并进行
df.groupby("客户分类").sum()

#对分组后结果重置索引
df.groupby(df["客户分类"]).sum().reset_index()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.分组键是列名
    • (1)按一列进行分组
      • (2)按多列进行分组
      • 2.分组键是Series
        • (1)按照一个Series进行分组
          • (2)按照多个Series进行分组
          • 3.神奇的aggregate方法
          • 4.对分组后的结果重置索引 reset_index()
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档