【问题标题】:Python Groupby Transform Multiple ArgumentsPython Groupby 转换多个参数
【发布时间】:2018-10-05 04:52:58
【问题描述】:

我正在寻求有关 Groupby + Transform 的帮助。我意识到它们结合起来是一个非常强大的工具,但是在查找我想要完成的文档/特定情况时遇到了麻烦。我想根据多个参数定义的组计算时间增量。具体来说,我想要一个列,仅当同时存在已分配和批准时,才按案例编号和站点显示分配到已批准的时间差。到目前为止,请参阅下面的数据集和代码:

数据集(开始)

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')))

感谢您的帮助!

【问题讨论】:

    标签: python pandas-groupby


    【解决方案1】:

    首先确保您的“CreatedDate”列是日期时间:

    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?

    【讨论】:

    • 感谢您的评论,参考的问题很有帮助。我更新了我的问题以包含更多细节。有没有办法只计算那些已经批准和分配的组以及只有这两条线的差异?
    • 我不确定我是否理解您的问题。但是你可以先有另一个只有“批准”和“分配”值的df:df2 = df.loc[df['New_value'].isin(['Approved', 'Assigned')] 然后做groupby。
    【解决方案2】:

    最后,我使用了数据透视表格式。从具有多索引的数据透视开始。

    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'])
    

    【讨论】:

      猜你喜欢
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 2016-08-12
      • 1970-01-01
      相关资源
      最近更新 更多