将groupby().agg()与列表中的lambdas合并

2024-06-06 06:39:46 发布

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

我有一个名为Pitchs的数据框,其中包含2019年MLB赛季的每一个投球,并包含投手id和投球类型列

我想按pitcher_id分组并计算每种音高类型的实例,我可以使用groupby().agg()方法进行分组,例如:

pitches.groupby('pitcher_id')['pitchType'].agg(
    [('Four-Seam Fastball',lambda pitchType: (pitchType=='Four-Seam Fastball').sum()),
    ('Curveball',lambda pitchType: (pitchType=='Curveball').sum())]
) 

我希望能够通过列表理解来实现这一点,但是当我尝试使用它时,结果列返回所有零。以下是我正在尝试的:

pitch_types = ['Four-Seam Fastball', 'Slider', 'Curveball', 'Changeup', 'Sinker']

pitches.groupby('pitcher_id')['pitchType'].agg(
    [(x,lambda pitchType: (pitchType==x).sum()) for x in pitch_types]
)

第一个例子完美无瑕。第二个返回一个数据帧,其中所有节距类型均为列,但值均为零。有人能告诉我哪里做错了,或者建议一种替代方法吗


Tags: 数据方法lambdaid类型aggfoursum
1条回答
网友
1楼 · 发布于 2024-06-06 06:39:46

让我们在这里试试value_counts

(pitches.query("pitchType in @pitch_types")
        .groupby('pitcher_id')['pitchType']
        .value_counts())

这样做的想法是过滤数据帧,只保留想要计算的值(让自己相信这不需要在groupby中完成,因此速度会快得多),然后您可以简单地计算每个组中剩下的值

相关问题 更多 >