2013-10-08 113 views
0

我有一个时间序列数据集,有10个观测单位。每个观察单位每天都可以进行一段时间的活动。因此,我有(可以说)4个变量的数据帧:分组和转换熊猫数据

日期 - 最新 单位 - 观察 acitvity的单位 - 一些活动 CumHours - 由一个单位的活动花了几个小时的累计数。

我需要创建一个'Hours_calc'变量,表示每天每条线上的任何活动花费了多少小时。进口一切正常位的作品后,我这样做:

DF = (mydata, columns = ['Date', 'Unit', 'Activity', 'CumHours']) 
DF['Hours_calc'] = np.nan 
DFGrouped = DF.groupby(['Unit', 'Activity']) 

我相信我所需要的变换方法,我认为,通过转换功能(如指定)的第一个参数是DF列作为系列与agg()方法一样。是对的吗?

我写了下面的函数,但正如你所看到的,我不知道计算中是否应该指DF或DFGrouped,或者是什么?一般来说如何引用goruped数据中的行/列?另外,我是否有权尝试返回与groupby组相同长度的系列?

def WorkingHours(x, Column): 
    LISTHOURS = [] 
    for row in xrange(1, len(x)): 
     Tot = int(DFGrouped[Column][row]) - int(DFGrouped[Column][row - 1]) 
     LISTHOURS.append(Tot) 
    return pd.Series(LISTHOURS) 

TESTDF = DFGrouped.transform({Hours_calc : lambda x : WorkingHours(x, 'CumHours')}) 

而且我没有看到有关传递一个快译通改造文档中任何东西,但我不能看到在gorup只有一个变量/列执行该功能的任何其他方式。

我在哪里错了?该错误消息很长,但令人困惑,但以“数据类型的转换函数无效”结束。

+0

我不确定我是否正确理解您的问题,但不应该按日期,单位而不是按单位和活动进行分组?通过这种方式,您可以使用每个组的CumHours总和来获取所有活动的总小时支出。 – yemu

+0

我不这么认为,我需要每天花费在任何活动上的时间。举例来说,假设在时间段内,单元1执行两个活动,而不一定在连续的几天。 CumHours测量该单位在当天进行的活动的累计时间。为了找到每日小时量度,我需要在给定的一天中累计小时数,并从执行该活动的最后一天中减去累计小时数。因此,按单位/活动进行分组并按日期排序, –

+3

可以提供数据文件的示例,其中填充了一些数据? – yemu

回答

2

我认为您可以使用shift函数将分组数据中的列移动一行。然后,如果您减去原稿并移位,您将获得活动花费的原始小时数。

df = (mydata, columns = ['date', 'unit', 'activity', 'cumhours']) 
grouped = df.groupby(['unit', 'activity']) 
shift_it = lambda x: (x - x.shift()) 
raw_hours = grouped.cumhours.transform(shift_it) 
df.insert(0, 'raw_hours',raw_hours) 

编辑1. 如果你想一般功能通过使用变换系元素迭代,但没有复制到列表中,试试这个:

df = (mydata, columns = ['date', 'unit', 'activity', 'cumhours']) 
grouped = df.groupby(['unit', 'activity']) 
def trans_func(x): 
    y=x.copy() 
    for i in range(1,len(x.index)): 
     x.iloc[i]=y.iloc[i]-y.iloc[i-1] 
    return x 

raw_hours = gr['cumhours'].transform(lambda x: trans_func(x)) 
df.insert(0, 'raw_hours',raw_hours) 
+0

谢谢,我会试试这个。我仍然想知道如何引用分组数据中包含的行,并对基础数据进行更改。我认为这个解决方案基本上可以工作,但它基于对每一行数据做同样的事情,而我想我能够编写一个函数,它遍历每一行并根据我的函数进行更改。有任何想法吗? –

+0

遍历你可以使用iloc函数的行,见上面 – yemu

1

我想我终于解决了这个问题。我怀疑,夜暮的回答是不错的,但我更喜欢这个,因为它是一个运动的最后学习如何运用自己的功能:

DF = (mydata, columns = ['Date', 'Unit', 'Activity', 'CumHours']) 
DF['Hours_calc'] = np.nan 
DFGrouped = DF.groupby(['Unit', 'Activity']) 

def WorkingHours(x): 
    CumHoursList = list(x) 
    HoursCalcList = [] 
    HoursCalcList.insert(0, CumHoursList[0]) 
    for index in xrange(1, len(CumHoursList)): 
     CalcHoursList/insert(index, CumHoursList[index] - CumHoursList[index - 1]) 
    return CalcHoursList 

DFGrouped['CumHours'].transform(lambda x: WorkingHours(x)) 

作品的魅力!

+0

虽然我仍然认为必须有一种方法来遍历作为x传递的系列,而不必将其转换为列表。但是这个解决方案现在对我来说很有用。 –

+0

编辑我的答案,包括更多一般的解决方案,不使用列表 – yemu

+0

LOVE THAT解决方案。谢谢 –