[英]How to get sum of transaction amount of every customer after some date in other data frame?
我有两个数据框。 一个在不同日期为不同客户提供多项交易,另一个数据框指定特定日期。 我想获得在其他数据框中指定的日期之后所有交易的总和。 我的第一个输入表如下所示:
ID txn_date txn_amt
1 01-Jan-19 3000
1 15-Jan-19 2000
1 16-Feb-19 5000
2 03-Jan-19 3000
2 19-Feb-19 9000
2 09-Mar-19 2000
2 01-Apr-19 1000
3 02-Apr-19 7000
第二个表看起来像这样:
ID notice_date
1 14-Jan-19
2 02-Feb-19
4 05-Feb-19
3 05-Mar-19
我的预期输出是:
ID txn_amt
1 7000
2 12000
3 7000
4 0
逻辑是,第一个表中的ID 1有3个事务,其中ID 1的notice_date是14-jan-19,所以14-jan-19之后只有两个ID 1的事务,所以在输出表中ID的值是7000( 2000 + 5000)。
您可以连接两个表,使用 ID 作为索引(不要为此担心重复),将所有日期从字符串转换为某种日期时间格式,然后在 txn_date>notice_date 的条件下对 txn_amt 求和,最后分组通过 ID 和 sum。
像这样:
joint_df = df1.set_index('ID').join(df2.set_index('ID'))
joint_df['txn_date'] = joint_df['txn_date'].apply(pd.Timestamp)
joint_df['notice_date'] = joint_df['notice_date'].apply(pd.Timestamp)
joint_df['txn_amt'][joint_df['txn_date'] >= joint_df['notice_date']].groupby('ID').sum()
IIUC,你可以试试这个:
df1.merge(df2, on = ['ID'], how='right')\
.query('txn_date > notice_date or txn_date != txn_date')\
.fillna(0).groupby('ID')['txn_amt'].sum()
输出:
ID
1 7000.0
2 12000.0
3 7000.0
4 0.0
Name: txn_amt, dtype: float64
此解决方案中有几个“技巧”。 首先,将“ID”与设置为“正确”的方式合并,使 ID 等于 4,其中 df1 中没有与 4 相关的记录。 其次,使用两个条件过滤合并的结果。 日期的第一个条件,然后在“ID”4 没有 txn_date 的情况下,我们希望保留这些 NaN 记录。 在 python 中,检查 NaN 的一个技巧是 NaN != NaN is True。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.