【问题标题】:Pandas GroupBy and Mean over Date RangePandas GroupBy 和日期范围内的平均值
【发布时间】:2019-01-20 20:37:35
【问题描述】:

我想使用 groupbymean 计算每个 ID 的平均值。但是,我只需要Date 在年份2016-01-012017-12-31 之间的行。

d = {'ID': ['STCK123', 'STCK123', 'STCK123'], 'Amount': [250, 400, 350], 
     'Date': ['2016-01-20', '2017-09-25', '2018-05-15']}



data = pd.DataFrame(data=d)
data = data[['ID', 'Amount', 'Date']]

data['Date'] = pd.to_datetime(data['Date'])

这给出了以下df:

    ID  Amount    Date
STCK123 250 2016-01-20
STCK123 400 2017-09-25
STCK123 350 2018-05-15

当我使用时:

data.groupby(['ID'])['Amount'].agg('mean')

它将所有行都考虑在内,因此平均值为333.3。如何排除 Date 为 2018 的行(平均值为 (250+400)/2=325)?

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    您需要使用query 进行预过滤步骤:

    df.query('Date.dt.year != 2018').groupby('ID').mean()
    
             Amount
    ID             
    STCK123     325
    

    evalquery 的更多用途以及相关参数可以在我的文章中找到:Dynamic Expression Evaluation in pandas using pd.eval()

    在调用groupby 之前,请参阅here 了解更多关于删除 行的方法。


    您也可以mask 这些行,而不必删除它们。 NaN 被排除在 GroupBy 聚合之外。

    df.mask(df.Date.dt.year == 2018).groupby('ID').mean()
    
             Amount
    ID             
    STCK123   325.0 
    

    【讨论】:

      猜你喜欢
      • 2020-06-18
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 2021-10-20
      • 2014-02-21
      • 1970-01-01
      相关资源
      最近更新 更多