2013-10-06 84 views
0

我有一个表示时间序列数据的熊猫数据框。我有一个名为DTDate(日期时间日期)的列和一个名为line_code(这是观察单位 - 它恰好是工厂中的生产线)的列。我有很多列的数据,但为了这个问题,可以想象只有三个:使用GroupBy熊猫折叠数据

工人 - 生产线上的工人数量。 item - 在生产线上生产的物品的名称。 输出 - 生产线上物料的输出量。

某些日子每行只产生一个项目,有时多个项目。因此,有时每个DTDate/line_code有一个观测值,有时会有多个观测值。我需要将每个DTDate/line_code的数据集合合并为一个观察值。

这里是蹭 - 我们还不知道我们想如何聚合数据,因此目前我只需要实现一个结构,我们可以尝试多个聚合方法。 当行只产生一个项目时,我只需要保留数据行就这样。当线条在给定的DTDate上生成多个项目时,我想根据以下内容将观察结果合并为一个观察值:

工人:如果在DTDate/line_code观察值中工人数量相等,则单个值的工作人员正在进入崩溃的集合。如果数字操作员不相等,则创建一个列表对象,其中包含DTDate/line_code观察值内的所有工作值。 item:项目的列表对象被转发到折叠后的集合。 输出:输出的列表对象被转发到折叠后的集合。

通过让折叠集中的列表项目,我将足够灵活地离开结构,从而让我自己能够对每个列进行不同的聚合方法实验,并且当我被指示达到这种效果时。

SOFAR我已经将数据分组如下:

import pandas as pd 
import numpy as np 
from pandas import DataFrame 
DF = DataFrame(mydata, columns = ['DTDate', 'line_code', \ 
            'workers', 'item', 'output']) 

DFGrouped = DF.groupby(['DTDate', 'line_code']) 

现在我认识到我所想要做的是以下几点:

DFAggregated = DFGrouped.agg({'DTDate': max(), 'line_code' : max(), \ 
           'workers' : myfunc1, 'item' : myfunc2, \ 
           'output' : myfunc2}) 

其中: myfunc1评估中如果所有值指定的列的组是相等的,如果它们是则返回单个值,如果不是,则返回每个值的列表。

myfunc2返回指定列内组中所有值的列表。

我的问题是,我没有idead如何编写这些函数,很大程度上,因为我不清楚如何遍历组特定的索引/行。我已阅读关于grouby等的python文档,但发现它不是非常有用。我意识到我应该发布更多我尝试过的代码,但我很难在这里站稳脚跟。任何指针将不胜感激。

(现在延伸到给说明性功能代码)

Incidentall我希望myfunc1和myfunc2所看起来是这样的:

def myfunc1(ColName): 
    if len(set([DFGroup[ColName][x] for x in DFGroup.index])) == 1: 
     return DFGroup[ColName].max() 
    else: 
      return [DFGroup[ColName][x] for x in DFGroup.index] 

def myfunc2(ColName): 
    return [DFGroup[ColName][x] for x in DFGroup.index] 

,你可以看到,我不知道如何来指代团体索引等

回答

2

将每个聚合函数(您传递给agg的函数)作为一个Series传递到聚合的列。所以你的myfunc2只是lambda x: list(x.unique())。你myfunc1是:

def collapse(x): 
    uniq = x.unique() 
    if len(uniq) == 1: 
     return uniq[0] 
    else: 
     return list(uniq) 

但是,您可能会发现结果有点尴尬的工作。至少,我认为你可能想总是返回一个列表(即,忘记myfunc1,并始终使用myfunc2)。你会发现处理列的某些值是单个标量和其他列表是很尴尬的。

此外,你可能想要看看使用apply,它可以让你返回整个数据帧。通过这种方式,您可以不用将项目折叠到列表中,而是为源列中的每个唯一值实际返回一个新的分组表格。

+0

其中参数x是列int int DF?谢谢这是有帮助的。看来我不需要实际遍历每个组中的索引。如果有必要的话,会怎么做?应用程序似乎也可能有用,而且似乎也以同样的方式用于保密。我现在看看。非常感谢。 –

+0

@WoodyPride:正如我所说的,函数的参数(在我的例子中是'x')是一个包含列数据的pandas Series。您可以像对待任何Series一样对它迭代或做任何事情。 – BrenBarn

+0

明白了,谢谢! –