0

10単位の観測を含む時系列データセットがあります。毎日、観察の各単位は、何時間も活動に従事することがあります。したがって、DataFrame には (たとえば) 4 つの変数があります。

日付 - 日付 単位 - 観察の単位 活動 - いくつかの活動 CumHours - 単位が活動に費やした累積時間数。

毎日、各行ごとに活動に費やされた時間数を示す「Hours_calc」変数を作成する必要があります。すべての通常のビットをインポートした後、私はこれを行います:

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

transform メソッドが必要だと思います。transform 関数に渡される最初の引数 (指定されている) は、agg() メソッドと同様に一連の DF 列であると思います。そうですか?

私は次の関数を書きましたが、ご覧のとおり、計算のために 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 を渡すことについてのドキュメントには何も表示されていませんが、グループ内の 1 つの変数/列のみで関数を実行する他の方法は見当たりません。

どこが間違っていますか?エラーメッセージは長くて紛らわしいですが、「データ型に対して無効な変換関数」で終わります

4

2 に答える 2

2

シフト機能を使用して、グループ化されたデータの列を1行シフトできると思います。次に、オリジナルとシフトを差し引くと、アクティビティに費やされた生の時間数が得られます。

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)

EDIT 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 に答える