Python 大熊猫的理解与应用

Python 大熊猫的理解与应用,python,pandas,group-by,apply,Python,Pandas,Group By,Apply,我试图理解Wes McKinney的《Python数据分析》一书中的一个例子。我查阅了熊猫食谱、文档等,但找不到像这样的例子 该示例查看2012年联邦选举委员会数据库()。下面的代码确定了向奥巴马和罗姆尼捐款最多的捐助职业 我很难理解函数是如何获取groupby对象并对其执行另一个groupby操作的。当我在函数之外运行这个函数时,我得到一个错误。有人能解释一下这种行为吗 谢谢 伊万 结果是这样的 cand_nm contbr_occupation

我试图理解Wes McKinney的《Python数据分析》一书中的一个例子。我查阅了熊猫食谱、文档等,但找不到像这样的例子

该示例查看2012年联邦选举委员会数据库()。下面的代码确定了向奥巴马和罗姆尼捐款最多的捐助职业

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

谢谢

伊万

结果是这样的

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

当您在分组数据帧上使用
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
==========
你甚至可以更进一步,做团体申请团体申请等等

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


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

谢谢!为了确保我得到了这个。上面定义的分组变量是DataFrameGroupBy对象。但当由apply函数执行操作时,它的行为类似于数据帧。这就是允许执行二次分组的原因,就像您在第二次分组中所做的那样。是的,
grouped
是一个
DataFrameGroupBy
对象。当您使用
apply(function)
时,它所做的几乎是将底层数据帧拆分为多个数据帧,每组一个。
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
==========