在风险管理中不管是做模型还是做策略,都需要进行数据分析。
而数据分析的基础是学好编程语言,本文和你一起来探索groupby函数,让你以最短的时间明白这个函数的原理。
也可以利用碎片化的时间巩固这个函数,让你在处理工作过程中更高效。
groupby函数定义
query函数实例
2.1 实例1
2.2 实例2
2.3 实列3
2.4 实列4
在pandas库中,groupby方法是一个非常强大的工具,用于将数据分割成组,并对这些组应用一些计算。 其基本调用语法如下:
groupby(by=None, axis=0, level=None, as_index: bool = True, sort: bool = True, group_keys: bool = True, squeeze: bool = <object object at 0x0000021CBA4B0C80>, observed: bool = False, dropna: bool = True)
重要参数详解:
by:指定用于分组的列名或列名的列表,默认值None,表示尝试使用对象的索引进行分组。此外,它也可以是一个函数,用于根据DataFrame中的值动态确定分组键。
axis
:指定分组的轴,对于DataFrame,0表示沿着行的方向分组(即按列的值分组),而1表示沿着列的方向分组(实际中较少见),默认值0。
level
:如果轴是MultiIndex(多级索引),则此参数用于指定要分组的级别。默认值None,表示使用所有级别。
as_index:指定分组后的结果是否作为DataFrame的索引。布尔值,默认值True,表示分组的键将作为结果DataFrame的索引。如果为False,则结果的DataFrame将有一个额外的索引级别,其标签为分组键。
sort
:指定分组结果是否按照分组列进行排序。布尔值,默认值True。在某些情况下,关闭排序可以提高性能,尤其当分组键已经排序时。
group_keys:指定分组后是否保留分组键,布尔值,默认True,表示结果DataFrame将包含用于分组的键的列。如果为False,则不会添加这些列。
squeeze:在pandas较新版本中,该参数可能已经被弃用或其行为可能有所变化。它通常用于在分组操作后尝试减少结果的维度(例如,若分组后只剩下一个元素,则尝试返回一个标量而不是Series)。然而,具体的行为可能因pandas版本而异。
二、groupby函数实例 1 实例1
首先生成一个含有Group和Value两列的数据框,具体代码如下:
import pandas as pd
# 创建一个DataFrame
data = {
'Group': ['A', 'B', 'A', 'B', 'A', 'C'],
'Value': [1, 2, 3, 4, 5, 6]
}
df = pd.DataFrame(data)
print(df)
得到结果: 接着用groupby函数分组求和,代码如下: # 分组求和
grouped = df.groupby('Group')['Value'].sum()
print(grouped)
得到结果: 可以手动验证结果是一致的。 如果想分组求均值,代码如下: # 分组求均值
print(df.groupby('Group')['Value'].mean())
得到结果: 可以手动验证结果是一致的。 如果想一次使用多个聚合函数,代码如下: grouped_agg = df.groupby('Group').agg({'Value': ['sum', 'mean']})
print(grouped_agg)
得到结果: 2 实例2
首先生成一个含有多列的DataFrame,具体代码如下:
import numpy as np
import pandas as pd
data = pd.DataFrame({
'name':['Tom', 'Kaggle', 'Litter', 'Sam', 'Sam', 'Sam'],
'city':['BeiJing', 'HuNan', 'ShangHai', 'BeiJing', 'HeiNan', 'HuNan'],
'race':['A', 'A', 'D', 'C', 'B', 'C'],
'age':[27, 25, 16, 17, 28, 24],
'height':[174, 180, 172, 182, 170, 178]
})
display(data)
得到结果: 可以发现对于name列,除了Sam出现了三次,其余名字都只出现了一次。 接着看下按race列分组后的数据,具体代码如下: list(data.groupby('race'))
得到结果: 可以发现,结果按A、B、C、D分别梳理出对应数据并存成了元组。 接下来看下分组后对多列求均值,代码如下: data.groupby('race')[['age', 'height']].mean()
得到结果: 可以手动验证结果是一致的。 接着看下分组后对不同组分别求聚合函数,代码如下: data.groupby('race').agg({'age':np.min, 'height':np.mean})
得到结果: 按race列分组后,对age列求最小值,对height列求均值,可以手动验证结果是一致的。
接着把goupby函数和apply函数结合使用,按姓名列分组,取每组前两行,代码如下:
data.groupby('name').apply(lambda x:x.head(2))
得到结果: 从结果知,由于其他名字都只有一行,取前两行时结果都保留,只有Sam有3行,取前两行则少了最后一行。
3 实例3
这一节对比as_index值为True(默认值)和False对结果的影响,首先沿用前面的数据框,来看下False的情况,代码如下:
data.groupby('race',as_index=False)['age'].mean()
得到结果: 接着看下as_index值为True的情况,代码如下: data.groupby('race',as_index=True)['age'].mean()
得到结果: 从结果知,as_index的作用是把分组变量是否当成索引,如果值为True则当成索引。
4 实例4
最后来对比一下sort值为True(默认值)和False的情况,如果值为False,代码如下:
data.groupby('race',sort=False)['age'].mean()
得到结果: 可以发现结果没有按分组变量进行排序。 接着看下sort值为True的情况,代码如下: data.groupby('race', sort=True)['age'].mean()
得到结果: 可以发现结果已按分组变量race进行分组。
至此,Python中的groupby函数已讲解完毕,如想了解更多Python中的函数,可以翻看公众号中“学习Python”模块相关文章。
【部分群限时免费进】分群讨论学习Python、玩转Python、风控建模【29.9元进】、人工智能、数据分析相关问题,还提供练习数据资料、招聘内推信息、优秀文章、学习视频、公众号文章答疑,也可交流工作中遇到的难题。如需添加微信号19967879837,加时备注想进的群,比如学习python。
【评分卡实现】应用Python中的toad.ScoreCard函数实现评分卡
【Python常用函数】一文让你彻底掌握Python中的toad.quality函数
【Python数据挖掘】应用toad包中的KS_bucket函数统计好坏样本率、KS值
限时免费进群
19967879837
添加微信号、手机号