【问题标题】:Understanding apply and groupby in Pandas了解 Pandas 中的 apply 和 groupby
【发布时间】:2017-06-20 16:15:43
【问题描述】:

我试图从 Wes McKinney 的 Python for Data Analysis 一书中理解一个示例。我浏览了 pandas 食谱、文档和 SO,但找不到像这样的示例。

该示例着眼于 2012 年联邦选举委员会数据库 (https://github.com/wesm/pydata-book/blob/master/ch09.ipynb)。下面的代码确定了捐赠给奥巴马和罗姆尼的顶级捐赠者职业。

我很难理解该函数如何获取一个 groupby 对象并对其执行另一个 groupby 操作。当我在函数之外运行它时,我得到一个错误。有人能解释一下这种行为吗?

谢谢,

伊万

# top donor occupations donating to Obama or Romney
def get_top_amounts(group, key, n = 5):
    totals = group.groupby(key)['contb_receipt_amt'].sum()

    return totals.sort_values(ascending  = False)[:n]

# first group by candidate
grouped = fec_mrbo.groupby('cand_nm')

# for each group, group again by contb_receipt_amt so we have a hierarchical index
# take the contribution amount
# then return the total amount for each occupation by cand sorted to give top n
grouped.apply(get_top_amounts, 'contbr_occupation', n= 5)

结果是这样的

cand_nm        contbr_occupation                     
Obama, Barack  RETIRED                                   25270507.23
               ATTORNEY                                  11126932.97
               INFORMATION REQUESTED                      4849801.96
               HOMEMAKER                                  4243394.30
               PHYSICIAN                                  3732387.44
               LAWYER                                     3159391.87
               CONSULTANT                                 2459812.71
Romney, Mitt   RETIRED                                   11266949.23
               INFORMATION REQUESTED PER BEST EFFORTS    11173374.84
               HOMEMAKER                                  8037250.86
               ATTORNEY                                   5302578.82
               PRESIDENT                                  2403439.77
               EXECUTIVE                                  2230653.79
               C.E.O.                                     1893931.11

【问题讨论】:

    标签: python pandas group-by apply


    【解决方案1】:

    当您在分组数据帧上使用 apply 时,您实际上是在遍历组并将每个组传递给您正在应用的函数。 我们来看一个简单的例子:

    import pandas as pd
    df = pd.DataFrame({'col1': [1,1,1,1,2,2,2,2],
                       'col2': ['a','b','a','b','a','b','a','b'],
                       'value': [1,2,3,4,5,6,7,8]})
    grouped = df.groupby('col1')
    

    现在让我们创建一个简单的函数,它允许我们查看传递给函数的内容:

    def print_group(group):
        print(group)
        print('=' * 10)
    
    grouped.apply(print_group)
       col1 col2  value
    0     1    a      1
    1     1    b      2
    2     1    a      3
    3     1    b      4
    ==========
       col1 col2  value
    0     1    a      1
    1     1    b      2
    2     1    a      3
    3     1    b      4
    ==========
       col1 col2  value
    4     2    a      5
    5     2    b      6
    6     2    a      7
    7     2    b      8
    ==========
    

    如您所见,每个组都作为单独的数据框传递给函数。当然,您可以将所有正常功能应用于此子集。 您看到第一组两次的事实是由于内部原因,无法更改,这不是错误;)。

    让我们创建另一个函数来证明这一点:

    def second_group_sum(group):
        res = group.groupby('col2').value.sum()
        print(res)
        print('=' * 10)
        return res
    
    grouped.apply(second_group_sum)
    col2
    a    4
    b    6
    Name: value, dtype: int64
    ==========
    col2
    a    4
    b    6
    Name: value, dtype: int64
    ==========
    col2
    a    12
    b    14
    Name: value, dtype: int64
    ==========
    

    你甚至可以更进一步,做 group-apply-group-apply-group-apply 等等...

    我希望这有助于了解发生了什么。

    顺便说一句,如果您使用 ipdb(调试工具),您可以在应用函数中设置断点,以便与组数据框交互。

    【讨论】:

    • 谢谢扬!所以要确保我得到了这个。上面定义的分组变量是一个 DataFrameGroupBy 对象。但是当被 apply 函数操作时,它的行为就像一个 DataFrame。这就是允许像在 second_group_sum 中那样执行辅助分组的原因。
    • 是的,grouped 是一个 DataFrameGroupBy 对象。它的作用是,当您使用 apply(function) 时,几乎会将底层 DataFrame 拆分为多个 DataFrame,每个组一个。
    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 2018-04-17
    • 1970-01-01
    • 2021-08-12
    • 2020-03-19
    • 2019-09-08
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多