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)的主要内容,如果未能解决你的问题,请参考以下文章
spark利器2函数之dataframe全局排序id与分组后保留最大值行
python使用pandas计算dataframe中每个分组的极差分组数据的极差(range)使用groupby函数和agg函数计算分组的最大值和最小值