0

我有一个包含 10 个观察单位的时间序列数据集。在每一天,每个观察单元都可以进行数小时的活动。因此,我在 DataFrame 中有 4 个变量:

Date - 日期 Unit - 观察单位 acitvity - 一些活动 CumHours - 一个单位在一项活动上花费的累计小时数。

我需要创建一个“Hours_calc”变量来说明每天每一行在任何活动上花费了多少小时。导入所有正常位后,我这样做:

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

我相信我需要 transform 方法,并且我认为传递给 transform 函数(如指定)的第一个参数是 DF 列作为一系列与 agg() 方法一样。那正确吗?

我编写了以下函数,但正如您将看到的,我不知道对于计算我应该指的是 DF 还是 DFGrouped,还是什么?一般来说,如何引用分组数据中的行/列?另外,我尝试返回与 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')})

此外,我在文档中没有看到任何关于将 Dict 传递给转换的内容,但我看不到任何其他仅在组中的一个变量/列上执行该函数的方法。

我哪里错了?错误消息很长,但以“转换函数对数据类型无效”结尾

4

2 回答 2

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)
于 2013-10-09T09:33:27.290 回答
1

我想我终于解决了这个问题。我怀疑 yemu 的答案很好,但我更喜欢这个,因为这是最终学习如何应用我自己的功能的练习:

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))

很有魅力!

于 2013-10-10T04:02:11.007 回答