我正在寻找Groupby + Transform的帮助。我意识到它们是一个非常强大的工具,但我很难找到我想要完成的文档/特定情况。我想根据多个参数定义的组计算时间增量。具体来说,我想要一个列,按Casenumber AND Site AND显示已分配给批准的时间差,仅当存在已分配和批准时。到目前为止,请参阅下面的数据集和代码:
数据集(开始)
Casenumber Site CreatedDate NewValue
1 A 2018-03-30 16:47:03 Approved
2 A 2018-04-02 19:24:43 Assigned
2 A 2018-04-02 25:24:43 Delayed
2 A 2018-04-02 20:49:45 Approved
2 B 2018-04-02 19:24:43 Assigned
2 B 2018-04-02 22:49:45 Approved
2 B 2018-04-02 25:24:43 Delayed
数据集(完成)
Casenumber Site CreatedDate NewValue Diff
1 A 2018-03-30 16:47:03 Approved N/A
2 A 2018-04-02 19:24:43 Assigned 0 days 0 hours
2 A 2018-04-02 20:49:45 Approved 0 days 1:25:02
2 A 2018-04-02 25:24:43 Delayed N/A
2 B 2018-04-02 19:24:43 Assigned 0 days 0 hours
2 B 2018-04-02 22:49:45 Approved 0 days 3:25:02
2 B 2018-04-02 25:24:43 Delayed N/A
到目前为止我得到了什么
(df['Diff'] = df['CreatedDate'] -
(df.groupby(['Casenumber', 'Site'])['CreatedDate'].transform('first')))
感谢您的帮助!
答案 0 :(得分:1)
首先确保'CreatedDate'列是datetime:
df['CreatedDate'] = pd.to_datetime(df['CreatedDate'])
然后这应该工作。
df['diff'] = df.sort_values(['Casenumber', 'Site']).groupby(['Casenumber', 'Site'])['CreatedDate'].diff()
查看这篇可能有用的帖子。 How to calculate time difference by group using pandas?
答案 1 :(得分:0)
最后,我使用了数据透视表格式。从具有多索引的数据的透视开始。
restrdata = pd.pivot_table(restrdata, index =['Casenumber','OldValue','Site'], columns = 'NewValue', values = 'CreatedDate', aggfunc = 'first')
然后我开始创建子透视表,拉出任何没有我正在寻找的响应的空值的Casenumber。
AAdata = restrdata[(~restrdata['Approved: Admin Excep'].isnull()).groupby(['Casenumber']).transform('any')]
最后,执行计算以获得仅批准和指定时间之间的差异。
AAdiff = (AAdata[~AAdata['Approved'].isnull()].reset_index(level=1)['Approved']
- AAdata[~AAdata['Assigned'].isnull()].reset_index(level=1)['Assigned'])