python数据分析之Dataframe分组(group by)

Posted 柳小葱

tags:

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

Dataframe分组统计group by函数

对数据进行分组统计主要使用Dataframe函数,其功能如下:

  • 根据给定的条件将数据拆分成组。
  • 每个组都可单独应用函数(如sum、mean、std等)。
  • 将结果合并到一个数据结果中。

语法如下:

Dataframe.groupby(by=None,axis=0,level=None,as_index=True,sort=True,group_keys=True,squeeze=False,observed=False)
"""
by:字典,映射,series对象,数组,标签,列表。如果by是一个函数,则对象索引的每个值调用它;如果传递了一个字典或者series对象,则使用该字典或者series对象来确定组。如果传递了数组ndarray,则按照原样式来确定这些组。
axis:axis=1表示行;axis=0表示列,默认值为0
level:表示索引层级,默认为无
as_index:布尔类型,默认为True,返回组标签为索引的对象
sort:对组进行排序,布尔类型,默认为True
group_keys:布尔类型,默认为True,调用apply函数时,将分组键添加到索引以标识片段
squeeze:布尔类型,默认为False,如果可能,减少返回类型的维度,否则返回一致类型
返回值:DataFrameGroupBy,返回包含有关组的信息的groupby对象

"""

2.展示举例数据集

这里我们使用书籍的数据进行展示。

import pandas as pd
pd.set_option('display.max_rows',500)#设置展示最高行数
pd.set_option('display.max_columns',1000)#设置展示最高列数
pd.set_option('display.unicode.east_asian_width',True)#设置列名对齐
#导入数据
df=pd.read_csv(r"C:\\Users\\Administrator\\Desktop\\python-code\\Code\\04\\15\\JD.csv",encoding="gbk")
print(df.head(10))

3.根据某一列分组

我们将"一级分类",“7天点击量”,"订单预定"这3列拿出组成一个新的df ,然后根据"一级分类"进行分组。并统计分组后的求和结果

#按照图书"一级分类"对订单数据进行分组统计求和
df1=df[["一级分类","7天点击量","订单预定"]]
print(df1.groupby('一级分类').sum())

这里我们可以看见,被分组的属性会被放到最左边,根据属性内的种类进行统计计算。

4.按照多列进行分组

我们抽取4列组成新的df,并按照2列进行分组

#按照图书的“一级分类”和“二级分类”对订单数据进行分组统计求和
df2=df[["一级分类","二级分类","7天点击量","订单预定"]]
print(df2.groupby(["一级分类","二级分类"]).sum())#分组统计求和

这里的分组,会按照"一级分类"进行分组后,再在"二级分类"分组内再进行分组。

如果我们想只获取分组后“7天点击量”的求和结果,我们可以只取这一列。
#按照“二级分类”分组,然后抽取“7天点击量”并对该列进行求和运算
print(df2.groupby("二级分类")["7天点击量"].sum())

5.对分组数据进行迭代

迭代是指对分组后的数据进行循环操作,查看每一种类型中的具体的结果。

#按照“一级分类”分组,并输出每一分类中的订单数据
df3=df[["一级分类","7天点击量","订单预定"]]
for name,group in df3.groupby("一级分类"):
    print(name)
    print(group)

上述代码的name是指“一级分类”分组后的值;而group是分组后的数据

如果对多列进行了分组,则需要在for循环中指定多列

key1和key2即是分组后的值

#迭代“一级分类”和"二级分类"的订单数据
df4=df[["一级分类","二级分类","7天点击量","订单预定"]]
for (key1,key2),group in df4.groupby(["一级分类","二级分类"]):
    print(key1,key2)
    print(group)

6.对分组后的某列或者多列使用聚合函数

主要使用函数agg对分组结果进行聚合运算

#按“一级分类”,"7天点击量"和“订单预定”,并求平均值和总和
print(df3.groupby("一级分类").agg(["mean","sum"]))

可以指定不同列使用不同的聚合效果

如:一列求平均和总和,一列只求总和

print(df3.groupby("一级分类").agg("7天点击量":['mean','sum'],"订单预定":['sum']))

7.通过字典和Series对象进行分组统计

这一部分主要就是通过字典或者series将某些类别重新打上标签,然后按照新的标签分类。

如:我们要将北京,上海,广州三个一线城市放在北上广,其他城市各自统计,给他们重新打上标签,然后分组。

  • 通过字典重新标签
#通过字典进行分组
df=pd.read_csv(r"C:\\Users\\Administrator\\Desktop\\python-code\\Code\\04\\23\\JD.csv",encoding="gbk")
df.set_index(['商品名称'],inplace=True)
dicts="上海出库销量":"北上广",
       "北京出库销量":"北上广",
       "广州出库销量":"北上广",
       "成都出库销量":"成都",
       "武汉出库销量":"武汉",
       "西安出库销量":"西安"
df5=df.groupby(dicts,axis=1).sum()
print(df5)

  • 通过series对象重新标签
#通过Series对象分组统计北上广的销量
data="上海出库销量":"北上广",
       "北京出库销量":"北上广",
       "广州出库销量":"北上广",
       "成都出库销量":"成都",
       "武汉出库销量":"武汉",
       "西安出库销量":"西安"
s1=pd.Series(data)
print(s1)
df6=df.groupby(s1,axis=1).sum()
print(df6)

series的结果:

分组series对象的结果:

结束!

以上是关于python数据分析之Dataframe分组(group by)的主要内容,如果未能解决你的问题,请参考以下文章

Pandas之groupby分组

聚合和分组数据然后根据列排序

spark利器2函数之dataframe全局排序id与分组后保留最大值行

Python DataFrame - 分组和质心计算

python使用pandas计算dataframe中每个分组的极差分组数据的极差(range)使用groupby函数和agg函数计算分组的最大值和最小值

Python,Pandas Dataframe 在分组后取回索引