Python .apply如何在DataFrame.groupby上工作?

Python .apply如何在DataFrame.groupby上工作?,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一份不同联赛的足球比赛结果明细表,并统计了该结果出现的次数 我想看看主场胜利、平局和客场胜利在总比赛中所占的比例。我在下面看到了一个解决方案: Count League Result EPL H 16 D 9 A 10 Champ H 67 D 15 A 57 H 87 La Liga

我有一份不同联赛的足球比赛结果明细表,并统计了该结果出现的次数

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

              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
        

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

我们通常做
变换

df.groupby("League").apply(lambda g: (g/g.sum()*100)
函数中的g是数据帧

df.Count=df.Count*100/df.groupby(level=0)['Count'].transform('sum')
df.groupby(级别=0)。应用(lambda x:type(x))
Out[607]:
联合会
钱普
EPL
西甲
数据类型:对象

g
是一个数据帧。由于您在
'League'
上分组,因此您将把数据帧分成单独的块,其中包含
'League'
的唯一值。为了说明这一点,我们可以迭代GroupBy对象

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

然后,
apply
将您的函数分别应用于这些数据帧。调用
g.sum()

               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

其中,“数据帧”是指groupby的一个组。@IgorRivin,基本上是该组的子数据帧
.apply(lambda x:type(x))
非常清楚地说明了这一点。这有助于了解您正在使用的对象的类型,因为应用的方法会有很大的不同。@r.ook是的,我知道grouoby对象是什么。然而,尤本的回答可能混淆了OP,因为后者可能不知道。谁是短语“我们通常进行转换”中的“我们”?从我坐的位置来看,
apply
agg
要多得多common@PaulH应用是很常见的,当您有大的数据帧时,运行时间会增加很多。查克,希望你能成为我们中的一员~@他很高兴这有帮助!由于
groupby
对象可能有点不透明,我发现像上面那样迭代最容易获得直觉(和调试)。从概念上讲,这与熊猫的行为没有什么不同。这就是说,当数据获取时,大熊猫已经优化了许多操作,因此将上述直接代码(甚至应用程序)转换为性能更高、不会循环的代码(如YOBEN_的解决方案)通常是首选。
               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
for idx, g in df.groupby('League'):
    print(g.sum(), '\n')

Count    226
dtype: int64 

Count    35
dtype: int64 

Count    75
dtype: int64