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
我想根据来自 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