[英]Sum and groupby if date is between two dates in two other columns and create new groupby data frame - pandas
[英]Pandas groupby and sum according to an index date from two data frames
我想根據來自 2 個單獨數據幀的索引日期對特征進行分組和求和。
我的意思是,讓我們假設我有以下數據框:
會員ID | 索引日期 | y值 |
---|---|---|
一個 | 2020-11-02 | 2 |
一個 | 2019-02-03 | 3 |
b | 2018-02-03 | 2 |
一個 | 2020-02-03 | 9 |
現在,最初,我使用以下代碼創建了另一行,其中包含查找日期(我想要匯總特征的時間段):
df['lookupDate'] = df['indexDate'] - pd.DateOffset(years=1)
並獲得以下數據框:
會員ID | 索引日期 | 查找日期 | y值 |
---|---|---|---|
一個 | 2020-11-02 | 2019-11-02 | 2 |
一個 | 2019-02-03 | 2018-02-03 | 3 |
b | 2018-02-03 | 2017-02-03 | 2 |
一個 | 2020-02-03 | 2019-02-03 | 9 |
我有另一個具有要與上述數據框合並的特征值的數據框。 特征數據框如下所示:
會員ID | 服務日期 | 特色1 | 特征2 | 特色3 |
---|---|---|---|---|
一個 | 2020-09-02 | 1 | 1 | 0 |
一個 | 2019-03-03 | 0 | 1 | 1 |
b | 2018-05-03 | 0 | 0 | 1 |
一個 | 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' 之間。 因此,對於第一個數據幀的第一行,我想要一個結果,例如:
會員ID | 索引日期 | 查找日期 | 特色1 | 特征2 | 特色3 | y值 |
---|---|---|---|---|---|---|
一個 | 2020-09-02 | 2019-09-02 | 2 | 1 | 0 | 2 |
現在,我想對具有不同周期開始和周期結束日期的每一行執行此操作。
使用DataFrame.merge
並通過boolean indexing
和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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.