在对熊猫进行分组之后如何在不同的列之间执行操作?

时间:2019-04-21 00:26:59

标签: python pandas pandas-groupby

我不确定自己做了什么,但是我期望这两种方法能从Lahmans Baseball数据集计算出棒球运动员的平均命中率。

import numpy as np
import pandas as pd

batting = pd.read_csv('https://github.com/bhishanpdl/Datasets/blob/master/Lahman_batting.csv?raw=true')

# create new col
batting['ba'] = batting['H'] / batting['AB']

# groupby for each baseball player
print(batting.groupby('playerID')[['ba','AB']]
             .sum().head().reset_index())

这给出了:

    playerID        ba     AB
0  aardsda01  0.000000      4
1  aaronha01  6.924731  12364
2  aaronto01  1.544619    944
3   aasedo01  0.000000      5
4   abadan01  0.117647     21

但是,只看第二个玩家,结果是错误的。

# sanity check for aaronha01
a = batting.query(""" playerID == 'aaronha01'  """)['H'].sum()
b = batting.query(""" playerID == 'aaronha01'  """)['AB'].sum()
a,b,a/b
(3771, 12364, 0.30499838240051763)

如何更正结果?

对于名为aaronha01的第二个玩家,结果应为0.30499838240051763,但groupby给出6.924731

更新
在R中,我们得到了正确的结果,但是我在Pandas中寻找方法:

library(Lahman)

batting = as_tibble(Lahman::Batting)
batters = batting  %>%  
    group_by(playerID) %>%  
    summarize(
      ba = sum(H, na.rm = TRUE) / sum(AB, na.rm = TRUE),
      ab = sum(AB, na.rm = TRUE)
    )

head(batters)

playerID    ba  ab
aardsda01   0.0000000   4
aaronha01   0.3049984   12364
aaronto01   0.2288136   944
aasedo01    0.0000000   5
abadan01    0.0952381   21
abadfe01    0.1111111   9

1 个答案:

答案 0 :(得分:2)

您可以对两列进行求和,然后在分组依据之后计算平均值:

gp = batting.groupby('playerID')[['H', 'AB']].sum()
gp['ba'] = gp.H/gp.AB
print(gp)

#              H     AB        ba
#playerID                        
#aardsda01     0      4  0.000000
#aaronha01  3771  12364  0.304998
#aaronto01   216    944  0.228814
#aasedo01      0      5  0.000000
#abadan01      2     21  0.095238
#abadfe01      1      9  0.111111
#abadijo01    11     49  0.224490

如果您希望它们全部在一起,可以与eval链接:

batting.groupby('playerID')[['H', 'AB']].sum().eval('ab = H / AB')

为解释您的原始问题,以上是击球平均值,其中每个AB的权重都相同。在您的原始公式中,首先为每一行计算一个'ba',然后取平均值,您将为每个观测值(在这种情况下,基本上是每年)赋予同等的权重,而不是蝙蝠上的每个个体。如果您按每行中AB的数量对平均值进行加权,您将获得与上述相同的答案。