如何解决Python pandas 可以有效地为连续行发现数据帧中的时间差
payeeId amount createdAt TrxnID
1001 2.30 2021-04-24 01:40:11.156000+00:00 100AA
1001 35 2021-04-24 02:10:11.146000+00:00 100AB
1001 600 2021-04-24 02:12:14.309000+00:00 100AC
1002 100 2021-04-24 02:59:51.127000+00:00 110BD
1003 1900 2021-04-24 04:09:15.113000+00:00 120AC
1003 10 2021-04-24 04:19:40.132000+00:00 120AM
If for a given 'PayeeId',the difference between two consecutive 'createdAt' is less than 300 seconds,then the flag will be set to 'No Settlement',else 'Approved'
所以结果数据框看起来像
payeeId amount createdAt TrxnID Flag
1001 2.30 2021-04-24 01:40:11.156000+00:00 100AA Approved
1001 35 2021-04-24 02:10:11.146000+00:00 100AB Approved
1001 600 2021-04-24 02:12:14.309000+00:00 100AC Not Approved
1002 100 2021-04-24 02:59:51.127000+00:00 110BD Approved
1003 1900 2021-04-24 04:09:15.113000+00:00 120AC Approved
1003 10 2021-04-24 04:19:40.132000+00:00 120AM Approved
所以我尝试使用以下代码片段:
gs = df.groupby(['payeeId'])['createdAt']
df['Time_Diff'] = gs.diff().fillna(pd.timedelta(seconds=0))/pd.timedelta(seconds=300)
df['Flag'] = np.where(df_sub_count['Time_Diff']>0,'Approved','No Settlement')
但是上面的没有产生想要的结果。我看到 payeeID
1002 的“No Settlement”。这是不可取的。
我在这里遗漏了什么。
解决方法
df['createdAt'] = pd.to_datetime(df.createdAt)
diff_sec=300.
mask= df.groupby('payeeId').createdAt.diff().astype('timedelta64[s]').fillna(diff_sec)
df['Flag'] = np.where(mask >= diff_sec,'Approved','Not Approved') # plz replace 'Not Approved' with 'No Settlement' based on requirement.
输出
payeeId amount createdAt TrxnID Flag
0 1001 2.3 2021-04-24 01:40:11.156000+00:00 100AA Approved
1 1001 35.0 2021-04-24 02:10:11.146000+00:00 100AB Approved
2 1001 600.0 2021-04-24 02:12:14.309000+00:00 100AC Not Approved
3 1002 100.0 2021-04-24 02:59:51.127000+00:00 110BD Approved
4 1003 1900.0 2021-04-24 04:09:15.113000+00:00 120AC Approved
5 1003 10.0 2021-04-24 04:19:40.132000+00:00 120AM Approved
说明。
我们按 payeeId
对 df 进行分组,并在几秒钟内获取 createdAt
之间的差异。
由于我们希望每个 payeeId
的第一次出现都被批准,因此用 300 填充 na。
然后我们使用 np.where
根据条件创建 Flag
列。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。