2017-08-02 27 views
3

我有几千行,看起来像这样的熊猫数据帧:大熊猫:分组和重新编制后的行之间的操作

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,得到的startDateTime之间的差异 ondemand_update_waspen-w7a和enddatetime ondemand_build_baspen-w7g。有什么办法呢?

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

-Sachin

回答

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去,因为逻辑上你想返回一个正三角时间和结束时间比开始时间总是更大。

我希望这有助于达到目的。

+0

虽然PiRSquared的建议是成功的,但我认为这更灵活。我已经遇到了数据清理问题(有些组没有这两个_jname_)。我仍然试图弄清楚如何在groupby之后清除/放弃组,如果数据丢失并且groupby的函数似乎是一种合理的方式来执行此操作。谢谢! –

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] 
+0

这很美 – Dark

+0

我在想和@Bharathshetty一样!但我认为,您还可以使用'diff'添加该方法,以防进一步的学习者遇到类似的问题,但jname列中有两个以上的不同值。 – ysearka

+1

谢谢你们俩。当两个值相距可预测的距离时,“diff”会很有用。我在这里没有那么奢侈,因为我在另一行有一列一列,另一列没有相关位置的保证。我可以强制这个问题,但我认为它很快就会变得丑陋。此外,在这种情况下,我必须假定每个'wbdqueue_id'的'jname'都是唯一的。如果不是,我就不得不选择我会选择哪一个。如果你有一个特定的想法,发表一个问题。 – piRSquared

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]