pandas函数应用篇之GroupBy.apply

本文通过一个具体实例展示了如何使用Pandas的GroupBy与Apply函数计算不同appID下的平均转化率。深入介绍了这两个函数的基本用法及应用场景,帮助读者更好地理解和掌握数据处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        讲解pandas.core.groupby.GroupBy.apply的一个运用实例,经常结合numpy库和隐函数lamda来使用,官网API看得云里雾里的。如果对博客的数据感兴趣可以在第一届.腾讯社交广告高校算法大赛处下载。

#将DataFrame类型的dfTrain按照key='appID'进行分组,生成GroupBy对象(由每个appID对应的rows组成的对象),然后由apply函数对每个对象进行lambda隐函数对应的函数操作:计算每个appID对应的lable列的平均值。
#dfTrain数据量太多,在后面有少部分数据展示,用于帮助理解。
key = "appID"
dfCvr = dfTrain.groupby(key).apply(lambda df: np.mean(df["label"])).reset_index()
#给DataFrame的columns重新赋值
dfCvr.columns = [key, "avg_cvr"]
print('dfCvr test dfTrain.groupby.apply function.')
print(dfCvr)
#数据太多展示部分输出结果
test dfTrain.groupby.apply function.
    appID   avg_cvr
0      14  0.002515
1      25  0.006042
2      68  0.000431
3      75  0.000000
4      83  0.106286
5      84  0.018963
6      88  0.081780
7     100  0.030855


#dfTrain数据太多展示小部分
         label  clickTime  conversionTime  creativeID   userID  positionID  \
0            0     170000             NaN        3089  2798058         293   
1            0     170001             NaN        3089   195578        3659   
2            0     170014             NaN        3089  1462213        3659   
3            0     170030             NaN        3089  1985880        5581   
4            0     170047             NaN        3089  2152167        5581   
5            0     170053             NaN        3089  2152167        5581  
         connectionType  telecomsOperator  adID  camgaignID  advertiserID  \
0                     1                 1  1321          83            10   
1                     0                 2  1321          83            10   
2                     0                 3  1321          83            10   
3                     1                 1  1321          83            10   
4                     1                 1  1321          83            10   
5                     1                 1  1321          83            10   
         appID  appPlatform  
0          434            1  
1          434            1  
2          434            1  
3          434            1  
4          434            1  
5          434            1  

1、pandas的groupby函数:
        pandas提供了一个灵活高效的groupby函数,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。根据一个或多个键(可以是函数、数组或DataFrame列名)拆分pandas对象。计算分组摘要统计,如计数、平均值、标准差,或用户自定义函数。对DataFrame的列应用各种各样的函数。应用组内转换或其他运算,如规格化、线性回归、排名或选取子集等。计算透视表或交叉表。执行分位数分析以及其他分组分析(目前没这么多深刻的体会,先记下来日慢慢领悟~)。

首先来看看下面这个非常简单的表格型数据集(以DataFrame的形式):

df6 = pd.DataFrame({'key1':['a', 'a', 'b', 'b', 'a'],
    'key2':['one', 'two', 'one', 'two', 'one'],
    'data1':np.random.randn(5),
    'data2':np.random.randn(5)})
#输出结果
df6                              
0    1.006038  2.610016    a  one
1    0.499684  1.004764    a  two
2    1.056336  0.303721    b  one
3    0.088034  0.723217    b  two
4   -0.927159 -0.216762    a  one


#假设你想要按key1进行分组,并计算data1列的平均值,我们可以访#data1,并根据key1调用groupby:
grouped = df6['data1'].groupby(df6['key1'])
print(grouped)
#输出结果,变量grouped是一个GroupBy对象,它实际上还没有进行任何计算,只是含有一些有关分组键df['key1']的中间数据而已,然后我们可以调用GroupBy的mean方法来计算分组平均值:
<pandas.core.groupby.SeriesGroupBy object at 0x1126b4c18>

grouped.mean()
#输出结果
Out[46]:
key1
a    0.192854
b    0.572185
Name: data1, dtype: float64

df.groupby('key1').mean()
#输出结果

data1   data2
key1        
a   0.092027    0.555432
b   0.332136    -0.715771

2、pandas的apply函数
        apply是pandas库的一个很重要的函数,多和 groupby 函数一起用,也可以直接用于 DataFrame 和 Series 对象。主要用于数据聚合运算,可以很方便的对分组进行现有的运算和自定义的运算。

groupby与apply函数的使用原理图(拆分-应用-合并三部曲):
这里写图片描述

### Pandas `groupby` 结合 `apply` 使用 Lambda 函数 在处理数据时,Pandas 提供了灵活的方法来执行复杂的数据转换和聚合操作。通过组合使用 `groupby` 和 `apply` 方法,并传递 lambda 表达式作为参数,能够实现高效的分组计算。 #### 单列分组并应用简单聚合 对于单列上的基本运算,可以直接利用内置的聚合函数;但对于更复杂的场景,则可通过定义匿名函数(即 lambda)来自定义逻辑: ```python import pandas as pd df = pd.DataFrame({ 'A': ['foo', 'bar', 'foo', 'bar'], 'B': [1, 2, 3, 4], 'C': [5, 6, 7, 8] }) result = df.groupby('A').apply(lambda x: sum(x['B'] + x['C'])) print(result) ``` 这段代码展示了如何基于某一特定条件对不同子集内的数值型字段求和[^2]。 #### 多列联合分组及自定义计算 当涉及到多个维度或需要跨多列进行综合分析时,同样可以借助于 lambda 来构建更加精细的操作流程: ```python def custom_aggregation(group): return { "total": group[['B','C']].sum().sum(), "mean_B": group['B'].mean() } multi_result = df.groupby(['A']).apply(lambda g: pd.Series(custom_aggregation(g))) print(multi_result) ``` 这里不仅实现了总和统计,还额外加入了平均值得到更为丰富的汇总信息。 #### 修改索引结构 除了直接作用于原始表格外,还可以调整输出结果的形式,比如更改层次化的索引名称等: ```python data = {'Value': range(6)} index = [(chr(i), chr(j)) for i in list(ord('A')+k//3 for k in range(6)) for j in list(ord('a')+(k%3)+ord('d')*int(k>=3))] df = pd.DataFrame(data=data,index=pd.MultiIndex.from_tuples(index)) new_df = df.groupby(level=0).apply( lambda x: x.set_index([pd.Index(range(len(x))), *x.index.levels[1:]])\ .rename_axis(['inner_level']+list(df.index.names)[1:]) ) print(new_df.reset_index()) ``` 此片段说明了怎样重新组织由 `groupby()` 所产生的多重索引表单,使其更适合进一步展示或后续加工的需求[^3].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值