• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

python数据高阶应用-pandas库聚合案例 groupby().apply()写法强化

武飞扬头像
侯小啾
帮助1

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


学新通

熟练掌握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]
                   })

数据如下所示:
             学新通


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


2. 对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。
    学新通


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

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

可以看到结果如下:
        学新通


3. 对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打印结果如下:
        学新通
可以看到,每个x都是一个DataFrame,且是按照“品种”列划分为四类品种的。


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

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

        学新通
这将不同于直接使用sum()方法:

对比结果以感受其差别

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

            学新通


4. 案例分享

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

import pandas as pd

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

               学新通


需求:求出每个品种的合计金额,每个品种中类型为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的最终结果:
           学新通


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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfaaai
系列文章
更多 icon
同类精品
更多 icon
继续加载