2017-08-02 26 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]