首页 > 解决方案 > Pandas GroupBy 和日期范围内的平均值

问题描述

我想使用groupby和计算每个 ID 的平均值mean。但是,我只需要Dateyear2016-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。如何排除Date2018 所在的行(产生 的平均值(250+400)/2=325)?

标签: pythonpandasdataframegroup-by

解决方案


您需要一个预过滤步骤query

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

         Amount
ID             
STCK123     325

在我的文章中可以找到更多关于eval、和相关参数的用途:使用 pd.eval() 在 pandas 中进行动态表达式评估query

有关在调用之前删除行的更多方法,请参见此处groupby


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

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

         Amount
ID             
STCK123   325.0 

推荐阅读