gpt4 book ai didi

python - pandas中的列groupby后如何在不同列之间执行操作?

转载 作者:太空宇宙 更新时间:2023-11-04 02:00:40 25 4
gpt4 key购买 nike

我不确定自己做了什么,但我希望这两种方法能得到相同的结果来计算 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

最佳答案

您可以对两列求和,然后在 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' 然后取平均值,您对每个观察值(在这种情况下基本上是每年)而不是每个人都给予相同的权重.如果您根据每行中的 AB 数量对该平均值进行加权,您会得出与上述相同的答案。

关于python - pandas中的列groupby后如何在不同列之间执行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55778882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com