我有以下"源"数据框

            Value
Date             
2022-01-01     26
2022-01-02     87
2022-01-03      4
2022-01-04     65
2022-01-05     89
2022-01-06     88
2022-01-07     82
2022-01-08     60
2022-01-09      8
2022-01-10     22

在另一个"输出"数据框中,我有4列定义了2个日期范围.如您所见,range1始终是定义的,而range2仅在某些行中定义:

  range1_lower range1_upper range2_lower range2_upper
0   2022-01-02   2022-01-03   2022-01-06   2022-01-07
1   2022-01-03   2022-01-06          NaN          NaN

在输出df中,我需要添加一个"average"列,如果日期在两个范围中的either个范围内,那么对于每一行,我得到源df的"Value"列的平均值.这与Excel中的AVERAGEIFS函数类似.

例如,对于第0行,我需要得到范围1(2022-01-02至2022-01-03)或范围2(2022-01-06至2022-01-07)内所有值的平均值.

对于第1行,由于没有定义range2,我只需要得到range1(2022-01-03到2022-01-06)内所有值的平均值.

这是预期输出:

  range1_lower range1_upper range2_lower range2_upper  average
0   2022-01-02   2022-01-03   2022-01-06   2022-01-07    65.25
1   2022-01-03   2022-01-06          NaN          NaN    61.50

有办法做到这一点吗?

推荐答案

您可以对这两个数据帧进行cross merge,然后过滤掉不在范围限制之间的日期,然后按范围列进行分组,并将Valuemean相加:

df = output.merge(source.reset_index(), how='cross')
df = df.query("range1_lower <= Date <= range1_upper or range2_lower <= Date <= range2_upper")
df = df.groupby([*output.columns], dropna=False)['Value'].mean().reset_index(name='avg')

print(df)

  range1_lower range1_upper range2_lower range2_upper    avg
0   2022-01-02   2022-01-03   2022-01-06   2022-01-07  65.25
1   2022-01-03   2022-01-06          NaT          NaT  61.50

Python相关问答推荐

如果条件为真,则Groupby.mean()

对Numpy函数进行载体化

根据条件将新值添加到下面的行或下面新创建的行中

TARete错误:类型对象任务没有属性模型'

按顺序合并2个词典列表

使用Python更新字典中的值

在输入行运行时停止代码

ConversationalRetrivalChain引发键错误

如何使用正则表达式修改toml文件中指定字段中的参数值

语法错误:文档. evaluate:表达式不是合法表达式

freq = inject在pandas中做了什么?''它与freq = D有什么不同?''

查找查找表中存在的列值组合

BeatuifulSoup从欧洲志愿者服务中获取数据和解析:一个从EU-Site收集机会的小铲子

如何关联来自两个Pandas DataFrame列的列表项?

有没有一种方法可以根据不同索引集的数组从2D数组的对称子矩阵高效地构造3D数组?

了解如何让库认识到我具有所需的依赖项

多个布尔条件的`jax.lax.cond`等效项

基于2级列表的Pandas 切片3级多索引

Python键盘模块不会立即检测到按键

从`end_date`回溯,如何计算以极为单位的滚动统计量?