在pandas中按列分组后,如何在不同的列之间进行操作?

2024-09-27 23:22:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我不确定我做了什么,但我希望这两种方法能得到相同的结果,从拉曼斯棒球数据集计算棒球运动员的平均命中率:

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中我们得到了正确的答案,但我在熊猫身上看到了:

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

Tags: rmimporttrueabaspdsumgroupby
1条回答
网友
1楼 · 发布于 2024-09-27 23:22:31

您可以对两列求和,然后计算groupby之后的平均值:

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',然后取平均值,你给每个观察结果的权重是相等的(在这种情况下基本上是每年),而不是每个个体的。如果你用每一排腹肌的数量来加权平均值,你会得到与上面相同的答案

相关问题 更多 >

    热门问题