2017-04-03 117 views
0

我有一個數據集,看起來像這樣:聚合數據基於行的Python

 Date   | ID | Task | Description 
2016-01-06 00:00:00 | 1 | 010 | This is text 
2016-01-06 00:10:00 | 1 | 020 | This is text 
2016-01-06 00:20:00 | 1 | 010 | This is text 
2016-01-06 01:00:00 | 1 | 020 | This is text 
2016-01-06 01:10:00 | 1 | 030 | This is text 
2016-02-06 00:00:00 | 2 | 010 | This is text 
2016-02-06 00:10:00 | 2 | 020 | This is text 
2016-02-06 00:20:00 | 2 | 010 | This is text 
2016-02-06 01:00:00 | 2 | 020 | This is text 
2016-02-06 01:01:00 | 2 | 030 | This is text 

任務020一般任務010後發生。這意味着當任務020開始意味着任務010端,同樣也適用於任務020,如果它在任何其他任務之前,則表示它已停止。

我需要組由Task計算平均期限總和計數每個ID每種類型的任務的,所以我期待這樣的事情:

ID | Task | Average | Sum | Count 
1 | 010 | 25 | 50 | 2 
1 | 020 | 10 | 20 | 2 
etc | etc | etc | etc | etc 

有更多的ID,但我只關心010020,所以無論從他們返回的號碼是可以接受的。

有人可以請幫助如何在Python中做到這一點?這遠遠超出了我目前的技能。

我正在使用anaconda發行版。

非常感謝先進。

+0

你怎麼知道**最後**任務的持續時間? –

+0

這是我遇到的一個問題,我無法真正瞭解這個持續時間。但是,因爲我只需要'010'和'020',所以我不需要知道它。 –

+0

嗨@jezrael對不起,我不明白你的問題。你想介紹一下嗎? –

回答

0

我認爲這是一個簡單的.groupby(),你需要。您樣本輸出不顯示時間戳和任務或ID

df['count'] = df.groupby(['ID','Task']).size() 

之間的任何複雜的鏈接會給你每一個獨特的ID /任務的數量在您的數據。要做一個總數或平均值,它是相似的,但是你需要一個有總和的列。

有關更多詳細信息,請參見here

+0

感謝您的迴應,但只有一個問題。我需要計算'日期'列中的時間差異,這是否意味着我需要以某種方式在手前進行此操作? –

+0

然後您需要使用'.shift()'創建一個超前/滯後函數(比較t1和t2的差異)http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.shift。html – philshem

0

看來你需要agggroupby,但在樣品不是數字列,以便col加入:

print (df) 
        Date ID Task Description  col 
0 2016-01-06 00:00:00 1 010 This is text  1 
1 2016-01-06 00:10:00 1 020 This is text  2 
2 2016-01-06 00:20:00 1 010 This is text  6 
3 2016-01-06 01:00:00 1 020 This is text  1 
4 2016-01-06 01:10:00 1 030 This is text  3 
5 2016-02-06 00:00:00 2 010 This is text  1 
6 2016-02-06 00:10:00 2 020 This is text  8 
7 2016-02-06 00:20:00 2 010 This is text  9 
8 2016-02-06 01:00:00 2 020 This is text  1 

df = df.groupby(['ID','Task'])['col'].agg(['sum','size', 'mean']).reset_index() 
print (df) 
    ID Task sum size mean 
0 1 010 7  2 3.5 
1 1 020 3  2 1.5 
2 1 030 3  1 3.0 
3 2 010 10  2 5.0 
4 2 020 9  2 4.5 

如果需要aggreagte日期時間,ID是有點複雜,因爲需要timedeltas

df.Date = pd.to_timedelta(df.Date).dt.total_seconds() 
df = df.groupby(['ID','Task'])['Date'] 
     .agg(['sum','size', 'mean']).astype(np.int64).reset_index() 
df['sum'] = pd.to_timedelta(df['sum']) 
df['mean'] = pd.to_timedelta(df['mean']) 
print (df) 
    ID Task    sum size   mean 
0 1 010 00:00:02.904078  2 00:00:01.452039 
1 1 020 00:00:02.904081  2 00:00:01.452040 
2 1 030 00:00:01.452042  1 00:00:01.452042 
3 2 010 00:00:02.909434  2 00:00:01.454717 
4 2 020 00:00:02.909437  2 00:00:01.454718 

查找欄中的差異date

print (df.Date.dtypes) 
object 

#if dtype of column is not datetime, first convert 
df.Date = pd.to_datetime(df.Date) 
print (df.Date.diff()) 
0    NaT 
1 0 days 00:10:00 
2 0 days 00:10:00 
3 0 days 00:40:00 
4 0 days 00:10:00 
5 30 days 22:50:00 
6 0 days 00:10:00 
7 0 days 00:10:00 
8 0 days 00:40:00 
9 0 days 00:01:00 
Name: Date, dtype: timedelta64[ns] 
+0

那麼這是否意味着我需要計算'Date'列中時間的差異,然後執行'groupby'? –

+0

也許是的,最好的是創建具有期望輸出的樣本數據。 – jezrael

+0

您可以通過'diff'功能獲得差異,請檢查我的答案。如果需要別的東西,請告訴我。 – jezrael