python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】

python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】

文章目录

python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】

熟练掌握groupby().apply()写法,有助于将碎片化的数据处理、步骤代码整合起来,这对提高工作效率是大有裨益的。

python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】

; 1. 准备数据

首先准备一组代码生成的DataFrame数据,代码如下所示:

import pandas as pd

df = pd.DataFrame({'品种': list('AAAABBBCCD'),
                   '类型': list('abcdccdadd'),
                   '金额': [1, 2, 1, 3, 2, 1, 3, 2, 3, 1]
                   })

数据如下所示:

python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】

(如果您对DataFrame的apply()存在疑问,欢迎点击这篇博客学习:python数据分析apply(),map(),applymap()用法归纳。)

  1. 对DataFrame对象使用apply()

apply()方法有两个重要的参数,第一个参数是一个自定义的函数(下边用fun()表示),第二个参数则是axis参数。
axis参数为0表示对列操作,设置为1则表示对行操作。

因为是以函数为参数,所以我们在解决实际问题时,还有一个要考虑的因素就是,这个”函数参数”的参数x指代的是什么。(即fun(x)中的x)
这里对上边得到的df做一个简单的示例来说明,对列操作,打印出每个x:

df.apply(lambda x: print(x))

可以看到x即每一列与索引组成的Series对象。因为除了打印没有任何操作,最后返回的是一个Values为None的Series。

python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】

如果要求和,则结果显而易见地容易理解:

df.apply(lambda x: x.sum())

可以看到结果如下:

python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】
  1. 对groupby()聚合的结果使用apply()

对DataFrame对象使用apply(),每个x是一个Series;
对groupby()聚合的结果使用apply(),得到每个x则会是一个DataFrame。

这是我们首先需要知道的,知道了这一点,后边的逻辑才能清晰。对变量df的”品种”列进行聚合,然后使用apply()方法打印每个x如下:

import pandas as pd

df = pd.DataFrame({'品种': list('AAAABBBCCD'),
                   '类型': list('abcdccdadd'),
                   '金额': [1, 2, 1, 3, 2, 1, 3, 2, 3, 1]
                   })
df.groupby(['品种']).apply(lambda x: print(x))

x打印结果如下:

python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】
可以看到,每个x都是一个DataFrame,且是按照”品种”列划分为四类品种的。

如果fun()功能是求和,则实现了先聚合,后求和:

df.groupby(['品种']).apply(lambda x: x.sum())

python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】
这将不同于直接使用sum()方法:

对比结果以感受其差别

df.groupby(['品种']).sum()

python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】
  1. 案例分享

下边给出一个略微复杂些的案例,通过groupby()+apply()的方法,可以更快捷地实现。
生成数据的代码及数据如下:

import pandas as pd

df = pd.DataFrame({'品种': list('AAAABBBCCD'),
                   '类型': list('abcdccdadd'),
                   '金额': [1, 2, 1, 3, 2, 1, 3, 2, 3, 1]
                   })
df

python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】

需求:求出每个品种的合计金额,每个品种中类型为a,b,c(不包括d)的合计金额,以及每个品种中 类型为a,b,c(不包括d)的合计金额,占该品种合计金额的比例。输出一个DataFrame。

先定义一个fun()函数,使其与groupby().apply()组合,最后再对结果的索引列稍作优化即可。

def fun(s):
    b = s['金额'].sum()
    t = 0
    for key, value in s['类型'].items():
        if ((value == 'a') | (value == 'b') | (value == 'c')):
            t += s['金额'][key]
    return pd.DataFrame([(t, b, t / b)], columns=['属于abc类型的金额汇总', '按品种汇总金额', '占比'])

r = df.groupby(['品种']).apply(fun)
result = r.reset_index().drop(['level_1'],axis=1)

因为r是双列索引,稍作优化,result的最终结果:

python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】

本次分享就到这里,小啾感谢您的关注与支持!
🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ

Original: https://blog.csdn.net/weixin_48964486/article/details/127588129
Author: 侯小啾
Title: python数据分析高阶应用技巧-pandas库聚合案例【 groupby().apply()写法强化】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/739587/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球