繁体   English   中英

如何在其他数据框中的某个日期之后获取每个客户的交易金额总和?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM