pandas:在分组和重建索引之后在行之间操作

时间:2017-08-02 15:02:22

标签: python pandas dataframe

我有一个包含几千行的pandas数据框,如下所示:

 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_id获取ondemand_build_baspen-w7g的ondemand_update_waspen-w7a和 enddatetime startdatetime 之间的区别。这样做的方法是什么?

我将CSV文件分类并解析 startdatetime enddatetime 作为时间。然后我按wbdqueue_id分组。我的想法是通过 jname 索引每个组,以便我可以找到我需要的两个 jname 的开始和结束时间戳。 但是当我这样做时,所有其他值都变为NaN或NaT(对于时间列)。

-Sachin

3 个答案:

答案 0 :(得分:3)

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]

答案 1 :(得分:1)

我会用所描述的逻辑编写一个函数,使事情非常明确,后续代码很容易理解:

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,因为从逻辑上讲,您希望返回正时间增量,结束时间总是大于开始时间。

我希望这是有目的的。

答案 2 :(得分:0)

如果您只需要在结果中使用statrdatetime和enddatetime之间的不同,那么您可以试试这个。

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]