2017-04-03 64 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