【问题标题】:Pandas groupby().agg() with lambdas in a list comprehension列表理解中带有 lambdas 的 Pandas groupby().agg()
【发布时间】:2020-11-08 09:14:46
【问题描述】:

我有一个名为 pitches 的数据框,其中包含 2019 年 MLB 赛季的每个球场,其中包含 pitcher_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]
)

第一个示例完美运行。第二个返回一个数据帧,其中所有音高类型作为列,但值全为零。谁能告诉我做错了什么或建议另一种方法?

【问题讨论】:

    标签: python pandas lambda pandas-groupby list-comprehension


    【解决方案1】:

    让我们在这里试试value_counts

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

    这个想法是过滤您的 DataFrame 以仅保留您想要计算的值(说服自己这不需要在 groupby 内部完成,这样会更快),然后您可以简单地计算您拥有的值留在每个组内。

    【讨论】:

    • 太棒了!我从来没有想过以这种方式接近它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2020-03-03
    • 2015-02-10
    • 2018-04-06
    • 2022-01-23
    • 2017-03-09
    • 2013-02-25
    相关资源
    最近更新 更多