2013-10-06 118 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

明白了,謝謝! –