Pandas 根据两个数据框中的索引日期分组并求和

Pandas groupby and sum according to an index date from two data frames

我想根据来自 2 个独立数据帧的索引日期对特征进行分组和求和。

我的意思是,假设我有以下数据框:

MemberID indexDate yValue
a 2020-11-02 2
a 2019-02-03 3
b 2018-02-03 2
a 2020-02-03 9

现在,最初,我使用以下代码创建了另一行,其中包含查找日期(我想从中总结特征的时间段):

df['lookupDate'] = df['indexDate'] - pd.DateOffset(years=1)

得到如下数据框:

MemberID indexDate lookupDate yValue
a 2020-11-02 2019-11-02 2
a 2019-02-03 2018-02-03 3
b 2018-02-03 2017-02-03 2
a 2020-02-03 2019-02-03 9

我有另一个数据框,它具有我想与上述数据框合并的特征值。特征数据框看起来像这样:

MemberID serviceDate feature1 feature2 feature3
a 2020-09-02 1 1 0
a 2019-03-03 0 1 1
b 2018-05-03 0 0 1
a 2020-06-03 1 0 0

现在,我想合并,这样我就可以查看第一个数据框的每一行,并将 lookupDate 视为循环开始日期,将 indexDate 视为循环结束日期第二个数据框。

我的意思是,对于 MemberID,'a',对于第一个数据框,周期开始日期为“2019-11-02”,周期结束日期为'2020-11-02'。现在,我将使用它查看第二个数据框和 groupby MemberID 并总结 MemberID 的特征,'a',这样它就是 groupby 并在周期开始和周期结束日期内总结。

这里,从第二个数据框中,将选择 MemberID 'a' 的第一行和最后一行,因为 serviceDate 位于“2019-11-02”和“2020-11-02”之间。因此,对于第一个数据框的第一行,我想要这样的结果:

MemberID indexDate lookupDate feature1 feature2 feature3 yValue
a 2020-11-02 2019-11-02 2 1 0 2

现在,我想对具有不同周期开始和周期结束日期的每一行执行此操作。

使用DataFrame.merge with filtering by boolean indexing with Series.between然后聚合sum:

df2 = df1.merge(df, on='MemberID', how='outer')

df2 = df1.merge(df, on='MemberID', how='outer')

df2 = (df2[df2['serviceDate'].between(df2['lookupDate'], df2['indexDate'])]
          .groupby(['MemberID','indexDate','lookupDate','yValue'], as_index=False).sum())
df2['yValue'] = df2.pop('yValue')
print (df2)
  MemberID  indexDate lookupDate  feature1  feature2  feature3  yValue
0        a 2020-02-03 2019-02-03         0         1         1       9
1        a 2020-11-02 2019-11-02         2         1         0       2