python - Pandas GroupBy 和日期范围内的平均值

标签 python pandas dataframe group-by

我想使用 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'])['金额'].agg('mean')

它考虑了所有行,得出平均值为 333.3。如何排除 Date 为 2018 年的行(产生平均值 (250+400)/2=325)?

最佳答案

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

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

         Amount
ID             
STCK123     325

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

参见here了解在调用groupby之前删除行的更多方法。

<小时/>

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

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

         Amount
ID             
STCK123   325.0 

关于python - Pandas GroupBy 和日期范围内的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54280746/

相关文章:

python - 使用时间触发器在 Azure 中运行 python 脚本的选项

python - Seaborn barplot 为色调添加 xticks

python - 连接已旋转的 Dataframe 中的两列

python - 根据条件从两个数据帧中提取值

r - 为数据框中的所有字符串分配相同的值

python - 检查 pandas 数据框中一行中的元素是否为 NaN 然后替换它

python - url 在 django 中不返回任何内容

python - 通过fft查找wav文件的频率幅度和相位

python - 由开始和结束时间戳定义的分割持续时间

python - 如何从数据框中的所有列名称/标题中删除数字