python - Python - 获取两个日期之间的平均值
问题描述
我想获得按商店分组的 2 个日期之间的平均值。
事实上,我有一个按商店和日期销售的第一个 xlsx
shop sell date
a 100 2000
a 122 2001
a 300 2002
b 55 2000
b 245 2001
b 1156 2002
我还有另一个文件,其中包含每个商店的开始和结束日期
shop start stop
a 2000 2002
a 2000 2001
b 2000 2000
所以我想从第二个文件中获取每个日期之间的销售平均值。
我尝试这样的事情,但我得到了一个 Df 列表,它对我来说不是很优化
dfend = []
for i in df2.values:
filt1 = df.shop == i[0]
filt2 = df.date >= i[1]
filt3 = df.date <= i[2]
dfgrouped = df.where(filt1 & filt2 & filt3).groupby('shop').agg(mean = ('sell','mean'), begin = ('date','min'), end = ('date', 'max'))
dfend.append(dfgrouped)
有人可以帮助我吗?
多谢
解决方案
merge
'shop' 上的两个 DataFrame。然后,您可以检查日期条件,between
用于过滤到计数的行。最后groupby
+ sum
。(这假设您的第二个 df 是唯一的)
m = df2.merge(df1, how='left')
(m[m['date'].between(m['start'], m['stop'])]
.groupby(['shop', 'start', 'stop'])['sell'].mean()
.reset_index())
# shop start stop sell
#0 a 2000 2001 111
#1 a 2000 2002 174
#2 b 2000 2000 55
如果其中的某些行在 中df2
没有符合条件的行df1
,则改为使用mask
,以便它们在 之后仍然得到一行(这也是合并中左侧 DataFramegroupby
的原因)。df2
在这里我添加了一个额外的行
print(df2)
# shop start stop
#0 a 2000 2002
#1 a 2000 2001
#2 b 2000 2000
#3 e 1999 2011
m = df2.merge(df1, how='left')
(m.where(m['date'].between(m['start'], m['stop']))
.groupby([m.shop, m.start, m.stop])['sell'].mean()
.reset_index())
# shop start stop sell
#0 a 2000 2001 111.0
#1 a 2000 2002 174.0
#2 b 2000 2000 55.0
#3 e 1999 2011 NaN
推荐阅读
- git - 错误地将大文件夹(`.terraform`)添加到git,提交,然后放入`.gitignore`,但仍想将大文件夹发送到原点
- r - 合并列表和合并元素
- informatica-powercenter - Informatica 路由器
- android - 为使用 Agora.io 视频通话 SDK 创建的视频通话应用实现画中画模式?
- vba - 在项目关闭时返回到 Outlook 中的上一个邮件项目
- javascript - ajax请求中没有出现警报消息
- flutter - 在 Isolate 中使用 flutter_local_notifications 插件
- c# - 如何将带有 EF Core 的 MySQL Geometry 类型属性映射到 .NET Core Geometry 类型属性?
- google-apps-script - 用于将文件从网站上传到 Google 云端硬盘的 Google App 脚本 - 适用于文本文件,但不适用于二进制文件
- hapijs - HapiJS 不接受表单数据请求