代码之家  ›  专栏  ›  技术社区  ›  Sachin Myneni

熊猫:分组和重新索引后在行之间操作

  •  3
  • Sachin Myneni  · 技术社区  · 7 年前

     x.head()
             id                       jname  wbdqueue_id       startdatetime  \
    59  1341127   ondemand_build_baspen-w7g        26581 2017-07-31 23:14:56
    60  1341126      ondemand_qa_qforchecka        26581 2017-07-31 23:15:35
    61  1341125      ondemand_build_bchecka        26581 2017-07-31 23:14:56
    63  1341123   ondemand_build_baspen-w7f        26581 2017-07-31 23:10:05
    64  1341122  ondemand_update_waspen-w7a        26581 2017-07-31 23:09:32
    
               enddatetime
    59 2017-07-31 23:19:12
    60 2017-07-31 23:34:12
    61 2017-07-31 23:15:30
    63 2017-07-31 23:14:56
    64 2017-07-31 23:10:00
    

    我想,对于每个wbdqueue\u id,得到 开始日期 ondemand_update_waspen-w7a和 ondemand\u build\u baspen-w7g的。怎么做?

    开始日期 结束日期时间 jname 这样我就可以找到这两个的开始和结束时间戳 我需要。 但当我这样做时,所有其他值都变成NaN或NaT(对于时间列)。

    -萨钦

    3 回复  |  直到 7 年前
        1
  •  3
  •   piRSquared    7 年前
    df.set_index('jname').groupby('wbdqueue_id').apply(
        lambda x: x.at['ondemand_update_waspen-w7a', 'startdatetime'] \
                - x.at['ondemand_build_baspen-w7f', 'enddatetime']
    )
    
    wbdqueue_id
    26581   -1 days +23:54:36
    dtype: timedelta64[ns]
    
        2
  •  1
  •   Abdou    7 年前

    我将用所描述的逻辑编写一个函数,使事情非常明确,后续代码易于遵循:

    import pandas as pd
    
    
    def get_time_diff(dff):
        start_time = dff[dff.jname.eq('ondemand_update_waspen-w7a')].startdatetime.values[0]
        end_time = dff[dff.jname.eq('ondemand_build_baspen-w7g')].enddatetime.values[0]
        return pd.Timedelta(end_time - start_time)
    

    然后您可以在 group-by 操作:

    df.groupby('wbdqueue_id').apply(get_time_diff)
    

    这将产生:

    wbdqueue_id
    26581   00:09:40
    dtype: timedelta64[ns]
    

    end_time - start_time ,因为从逻辑上讲,您希望返回正的时间增量,并且结束时间始终大于开始时间。

    我希望这是有目的的。

        3
  •  0
  •   BENY    7 年前

    df1=df.loc[df.jname.isin(['ondemand_update_waspen-w7a','ondemand_build_baspen-w7f']),:]
    df1.groupby('wbdqueue_id').apply(lambda x:x.startdatetime-x.enddatetime.shift())[4]
    
    
    Out[467]: 
    wbdqueue_id
    26581.0   -1 days +23:55:00
    Name: 4, dtype: timedelta64[ns]