【问题标题】:How does .apply work on a Pandas DataFrame.groupby?.apply 如何在 Pandas DataFrame.groupby 上工作?
【发布时间】:2020-09-17 09:57:48
【问题描述】:
              Count
League  Result         
EPL     H      16
        D      9
        A      10
Champ   H      67
        D      15
        A      57
        H      87
La Liga D      35
        A      40
        

我有不同联赛的足球比赛结果明细,以及该结果出现的次数。

我想看看主队胜、平局、客队胜场在总比赛中所占的比例。我在下面看到了解决方案:

df.groupby("League").apply(lambda g: (g/g.sum()*100)

乍一看,这是有道理的,但这里的 g 到底是什么?我假设它是 H、D 或 A 计数,然后 g.sum() 将按每个部门分组的所有 H、D、A 计数相加。但是,如果g 只是一个值,我们如何调用方法g.sum()g 到底是什么?

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    我们通常做transform

    df.Count=df.Count*100/df.groupby(level=0)['Count'].transform('sum')
    

    你的函数中的g是数据框

    df.groupby(level=0).apply(lambda  x : type(x))
    Out[607]: 
    League
    Champ      <class 'pandas.core.frame.DataFrame'>
    EPL        <class 'pandas.core.frame.DataFrame'>
    La Liga    <class 'pandas.core.frame.DataFrame'>
    dtype: object
    

    【讨论】:

    • “数据框”是指 groupby 的组之一。
    • @IgorRivin 基本上是该组的子DataFrame.apply(lambda x: type(x)) 说得很清楚。了解您正在使用的对象的 type 会有所帮助,因为应用的方法会有很大差异。
    • @r.ook 是的,我知道 grouoby 对象是什么。但是,Yoben 的回答可能让 OP 感到困惑,因为后者可能不知道这一点。
    • “我们通常做一个变换”这句话中的“我们”是谁?从我坐的位置来看,applyagg 更常见
    • @PaulH apply 很常见,当你有大数据帧时,运行时间会增加很多。检查stackoverflow.com/questions/54432583/…,希望你能成为我们中的一员。 ~
    【解决方案2】:

    g 是一个数据帧。由于您在'League' 上进行分组,您会将DataFrame 拆分为单独的块,其中包含'League' 的唯一值。为了说明这一点,我们可以遍历 GroupBy 对象。

    for idx, g in df.groupby('League'):  # `idx` is the unique group key
        print(g, '\n')
    

                   Count
    League Result       
    Champ  H          67
           D          15
           A          57
           H          87
    
                   Count
    League Result       
    EPL    H          16
           D           9
           A          10
    
                    Count
    League  Result       
    La Liga D          35
            A          40
    

    apply 然后将您的函数分别应用于这些 DataFrame 中的每一个。调用 g.sum() 将为您提供一个对组中的每一列求和的 Series。

    for idx, g in df.groupby('League'):
        print(g.sum(), '\n')
    
    Count    226
    dtype: int64 
    
    Count    35
    dtype: int64 
    
    Count    75
    dtype: int64 
    

    【讨论】:

    • @theman 很高兴它有帮助!由于groupby 对象可能有点不透明,我发现获得直觉(和调试)最容易像上面那样迭代。从概念上讲,它与 pandas 所做的没有什么不同。话虽如此,当数据变大时,pandas 已经优化了许多这些操作,因此通常首选将上面直接的代码(甚至是您的应用)转换为性能更高且不会循环的东西,就像在 YOBEN_S 的解决方案中一样。
    猜你喜欢
    • 2013-03-23
    • 2015-12-01
    • 2020-12-02
    • 2020-04-12
    • 2019-12-27
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2018-06-06
    相关资源
    最近更新 更多